home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 126-150 / disk_144 / analyticalc / analysources.arc / AnalyDM.Ftn < prev    next >
Text File  |  1987-11-08  |  115KB  |  4,419 lines

  1. c -h- declr.for    Fri Aug 22 13:02:54 1986    
  2.     SUBROUTINE DECLR(ITYP,RETCD)
  3. C COPYRIGHT (C) 1983 GLENN EVERHART
  4. C ALL RIGHTS RESERVED
  5. C 60=MAX REAL ROWS
  6. C 301=MAX REAL COLS
  7. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  8. C VBLS AND TYPE DIMENSIONED 60,301
  9. C **************************************************
  10. C *                                                *
  11. C *       SUBROUTINE  DECLR (ITYP,RETCD)           *
  12. C *                                                *
  13. C **************************************************
  14. C
  15. C
  16. C ANALYZES VECTOR LINE TO DETERMINE WHAT VARIABLES GET THEIR
  17. C TYPES CHANGED. THE NEW TYPE IS SPECIFIED AS AN ARGUMENT IN
  18. C THE CALL:
  19. C
  20. C
  21. C  TYPE CODE
  22. C    1  ASCII
  23. C    2  DECIMAL (REAL BUT DECIMAL POINT FOR OUTPUT)
  24. C    3  HEXADECIMAL
  25. C    4  INTEGER
  26. C    5  MULTIPLE PRECISION (BASE 10)
  27. C    6  MULTIPLE PRECISION (BASE 8)
  28. C    7  MULTIPLE PRECISION (BASE 16)
  29. C    8  OCTAL
  30. C    9  REAL
  31. C
  32. C  IF NEGATIVE, TYPE IS DEFINED BUT VARIABLE HAS
  33. C  NOT BEEN ASSIGNED A VALUE
  34. C
  35. C
  36. C  RETCD     MEANING
  37. C  1    =    O.K.
  38. C  2    =    ERROR
  39. C
  40. C  NOTE:  AS IN FORTRAN, VARIABLES IN DECLARATIONS MUST BE SEPARATED
  41. C         BY COMMAS
  42. C
  43. C
  44. C  MODIFICATION CLASSES: M1, M2
  45. C
  46. C
  47. C
  48. C
  49. C DECLR CALLS:
  50. C
  51. C  ERRMSG   PRINTS ERROR MESSAGES
  52. C
  53. C
  54. C
  55. C DECLR IS CALLED BY CMND, THE ROUTINE THAT DECODES COMMANDS.
  56. C
  57. C
  58. C
  59. C
  60. C       VARIABLE        USE
  61. C
  62. C    ALPHA           LIST OF LEGAL VARIABLE NAMES. THE FIRST 26 ARE
  63. C                    ALPHABETIC, THE 27TH IS THE CHARACTER '%'.
  64. C    BLANK           ' '
  65. C    I,I2,I3         TEMPORARY VALUES.
  66. C    ITYP            CODE THAT GIVES THE TYPE OF VARIABLE FOR A
  67. C                    PARTICULAR CALL TO THIS ROUTINE. VARIABLES ARE
  68. C                    EITHER DECLARED TO BE OF THIS TYPE OR, IF NO
  69. C                    VARIABLES ARE SPECIFIED, A LIST OF ALL THE
  70. C                    VARIABLES OF THAT TYPE ARE GIVEN.
  71. C    LEND            LAST NON-BLANK IN VECTOR LINE(80).
  72. C    LINE(80)        HOLDS INPUT COMMAND LINE. IF DECLARATION HAS
  73. C                    NO ARGUMENT, THIS VECTOR IS THEN USED TO OUTPUT
  74. C                    A LIST OF VARIABLES OF THE TYPE SPECIFIED.
  75. C    NONBLK          START SCAN OF VARIABLE LIST.
  76. C    TYPE            HOLDS THE TYPE CODE FOR EACH VARIABLE.
  77. C
  78. C
  79. C
  80. C
  81. C
  82. C
  83. C
  84. C    SUBROUTINE DECLR(ITYP,RETCD)
  85.     InTeGer*4 LEVEL,NONBLK,LEND
  86.     InTeGer*4  RETCD,VIEWSW,BASED,VLEN(9)
  87.     InTeGer*4 TYPE(1,1)
  88.     InTeGer*4 I,I2,I3,ITYP
  89. C
  90.     CHARACTER*1  LINE(80),AVBLS(20,27),VBLS(8,1,1)
  91.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  92. C
  93.     COMMON  /V/TYPE,AVBLS,VBLS,VLEN
  94.     COMMON  /CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  95.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  96. C
  97. C
  98. C
  99.     IF(NONBLK.EQ.LEND)GO TO 500
  100. C
  101. C
  102. C **************************************************
  103. C ****** DECLARE VARIABLES TO BE OF TYPE ITYP ******
  104. C **************************************************
  105.     I2=NONBLK+1
  106. 10    CONTINUE
  107. C10    IF (LINE(I2).EQ.BLANK) GOTO 60
  108. C    DO 20 I3=1,26
  109. C    IF (LINE(I2).EQ.ALPHA(I3)) GOTO 30
  110. C20    CONTINUE
  111. C *****&&&&& ADD VARIABLE SIZE SUPPORT - GCE
  112.     CALL VARSCN(LINE,I2,LEND,LSTCHR,ID1,ID2,IVALID)
  113. C VARSCN SEARCHES FOR VALID VARIABLE NAME STRINGS INCLUDING C$+EXPR
  114. C AND R$+EXPR FOR LOC-RELATIVE NAMES IN ABSOLUTE AND C@+N, R@+N FOR RELATIVE
  115. C NAMES IN DISPLAY SYSTEM. IT RETURNS THE ID1, ID2 INDICES FOR
  116. C THE VARIABLES IN VBLS ARRAY AND TYPE ARRAY. FOR SINGLE ALPHAS
  117. C A-Z, ID1 RETURNS 1-26 AND ID2=1. % RETURNS ID1=27, ID2=1.
  118.     IF(IVALID.EQ.0) GOTO 22
  119. C VALID FLAG IS NONZERO IF VARIABLE NAME IS VALID, ELSE 0.
  120.     I2=LSTCHR
  121. C LSTCHR RETURNS LAST CHARACTER OF NAME
  122.     GOTO 30
  123. C
  124. C  ILLEGAL CHARACTER IN DECLARATION'S VARIABLE LIST
  125. 22    I=4
  126. C
  127. C
  128. C
  129. C ******* ERROR RETURN *******
  130. 25    RETCD=2
  131.     CALL ERRMSG(I)
  132.     RETURN
  133. C
  134. C
  135. C
  136. C
  137. 30    CONTINUE
  138. C IF OLD VARIABLE WAS UNDEFINED, MAKE NEW TYPE LESS THAN 0 ALSO.
  139. C THIS ALLOWS ONE TO EXAMINE INTERNAL VALUES FOR DIFFERENT DATA
  140. C TYPES. IF THIS IS NOT NEEDED, IT WOULD BE CLEANER TO ALWAYS MAKE
  141. C VARIABLES UNDEFINED WHEN THEIR DATA TYPE IS CHANGED. TO DO THIS
  142. C JUST USE THE STATEMENT
  143. C    I=-ITYP
  144.     I=ITYP
  145. C ****&&&&&& NOTE TYPE NOW 2-DIM
  146.     CALL TYPGET(ID1,ID2,TYPE(1,1))
  147.     IF(TYPE(1,1).LE.0)I=-I
  148.     CALL TYPSET(ID1,ID2,I)
  149. C    TYPE(ID1,ID2)=I
  150.     I3=I2+1
  151.     IF (I3.GT.LEND) GOTO 1000
  152.     DO 40 I2=I3,LEND
  153.     IF (LINE(I2).EQ.BLANK) GOTO 40
  154.     IF (LINE(I2).EQ.COMMA) GOTO 45
  155. C
  156. C VARIABLES NOT SEPARATED BY COMMAS
  157.     I=5
  158.     GO TO 25
  159. 40    CONTINUE
  160.     GOTO 1000
  161. 45    IF (I2.EQ.LEND) GOTO 22
  162. 60    I2=I2+1
  163.     IF (I2.LE.LEND) GOTO 10
  164.     GO TO 1000
  165. C
  166. C
  167. C
  168. C
  169. C
  170. C
  171. C **********************************************************************
  172. C ** NO ARGUMENTS SO SHOW WHAT VARIABLES HAVE BEEN DECLARED THAT TYPE **
  173. C **********************************************************************
  174. 500    CONTINUE
  175.     IF(VIEWSW.EQ.0) GO TO 1000
  176. C PERHAPS THE ABOVE LINE SHOULD BE REMOVED (???)
  177. C
  178. C
  179. C BLANK OUT OUTPUT LINE.
  180.     DO 510 I=1,80
  181. 510    LINE(I)=BLANK
  182. C
  183. C
  184. C SEARCH FOR VARIABLES OF TYPE ITYP. PUT THEM IN LINE(I2) WHEN FOUND FOR
  185. C LATER PRINTING.
  186.     I2=0
  187.     DO 550 I=1,27
  188. C FAKE UP DISPLAY
  189. C ****&&&&&
  190.     CALL TYPGET(I,1,TYPE(1,1))
  191.     IF(IABS(TYPE(1,1)).NE.ITYP)GO TO 550
  192.     I2=I2+1
  193.     LINE(I2)=ALPHA(I)
  194. 550    CONTINUE
  195. C
  196. C
  197. C GO TO SECTION APPROPRIATE FOR PRINTING EITHER THE LIST OF VARIABLES OR
  198. C A MESSAGE INDICATING THAT NO VARIABLES ARE OF THAT TYPE.
  199.     IF(I2.EQ.0) GO TO 600
  200. C
  201. C
  202. C OUTPUT A LIST OF VARIABLES OF TYPE ITYP
  203.     WRITE(11,560) (LINE(I),I=1,I2)
  204. 560    FORMAT(' VARIABLES SO DECLARED = ',30A1)
  205.     GO TO 1000
  206. C
  207. C
  208. C
  209. C
  210. C NO VARIABLES OF THAT TYPE
  211. 600    WRITE(11,610)
  212. 610    FORMAT(' NO VARIABLES OF THAT TYPE')
  213. C
  214. C
  215. C
  216. C **** NORMAL RETURN ****
  217. 1000    RETCD=1
  218.     RETURN
  219.     END
  220. c -h- doentr.for    Fri Aug 22 13:03:06 1986    
  221.     SUBROUTINE DOENTR(FORM,LOW,LHIGH)
  222. C +++++++++++++++++++++++++++++++++++
  223. C PARAMETER 18060=60*301
  224.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  225.     INTEGER*4 VNLT
  226.     DIMENSION FORM(128),FVLD(1,1)
  227. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  228. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  229. C SO INITIALLY IGNORE.
  230. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  231. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  232.     InTeGer*4 RRWACT,RCLACT
  233. C    COMMON/RCLACT/RRWACT,RCLACT
  234.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  235.      1  IDOL7,IDOL8
  236. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  237. C     1  IDOL7,IDOL8
  238.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  239. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  240.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  241. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  242. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  243. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  244.     InTeGer*4 KLVL
  245. C    COMMON/KLVL/KLVL
  246.     InTeGer*4 IOLVL,IGOLD
  247. C    COMMON/IOLVL/IOLVL
  248. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  249. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  250.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  251.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  252.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  253.     EXTERNAL INDX
  254.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  255.     COMMON/D2R/NRDSP,NCDSP
  256.     InTeGer*4 TYPE(1,1),VLEN(9)
  257.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  258.     REAL*8 ACY
  259.     EQUIVALENCE(ACY,AVBLS(1,27))
  260.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  261.     COMMON/FVLDC/FVLD
  262. C +++++++++++++++++++++++++++++++++++
  263. C ENABLE { FORMS TO HANDLE ALL POSSIBLE EQUATIONS.
  264.     CALL FRMEDT(FORM,LLST)
  265.     IITR=0
  266. 5050    IITR=IITR+1
  267.     FORM(111)=0
  268.     LCURR=LOW
  269. C DO AN ENTRY. MUST SCAN FOR MULTIPLE STATEMENTS PER LINE AND ALSO
  270. C RECOGNIZE FUNCTION NAMES.
  271. 1000    CONTINUE
  272.     KKK=ICHAR('\')
  273.     LSL=INDX(FORM(LCURR),KKK)
  274.     IF(LSL.EQ.0)LSL=LHIGH
  275. C CLAMP AT 80 CHARS LONG INPUT.
  276.     IF(LSL.LE.79)GOTO 1200
  277. C STMT HAS NO MULTIPLES. SQUASH IT TO USE ONLY 1ST PART...
  278.     LSL=79
  279.     LCURR=LHIGH
  280.     FORM(80)=0
  281. 1200    CONTINUE
  282.     IF(FORM(LCURR).NE.'<')GOTO 5052
  283.     IF(ACY.GT.0. .AND.
  284.      2  IITR.LT.100)GOTO 5050
  285. C ALLOW IN-FORMULA LOOPING PROVIDED % IS POSITIVE AND
  286. C WITH LIMITED RETRIES...
  287. C AVOID CALLING DOSTMT WITH BOGUS < CHARACTER AS "FORMULA" SO
  288. C WE AVOID ERROR MESSAGES.
  289.     GOTO 5051
  290. 5052    CONTINUE
  291.     CALL DOSTMT(FORM(LCURR),LSL)
  292. 5051    IF (LCURR.GE.LHIGH)RETURN
  293.     LCURR=LCURR+LSL
  294.     If(Lcurr.lt.Lhigh)GOTO 1000
  295.     Return
  296.     END
  297. c -h- doif.for    Fri Aug 22 13:03:17 1986    
  298.     SUBROUTINE DOIF(LINE,LLB,LRB,LLAST)
  299. C    PARAMETER 1=1,12=12
  300.     EXTERNAL INDX
  301.     CHARACTER*1 LINE(110)
  302.     REAL*8 V1,V2
  303.     V1=0.
  304.     V2=0.
  305.     LS=LRB-LLB+1
  306.     CALL GETLOG(LINE(LLB),LS,LOGTYP,LASST)
  307.     LOV1=LLB
  308.     LHIV1=LASST+LLB-1
  309.     IF(LOV1.GE.LHIV1)GOTO 100
  310. C USE SUM FUNCTION HERE AS TYPE OF FCN
  311.     LT=4
  312.     CALL DOMFCN(LINE,LOV1,LHIV1,LT,V1)
  313. 100    CONTINUE
  314.     IF(LOGTYP.EQ.0)GOTO 1000
  315.     LOV2=LASST+2+LLB
  316.     LHIV2=LRB
  317.     IF(LOV2.GE.LHIV2)GOTO 200
  318.     LT=4
  319.     CALL DOMFCN(LINE,LOV2,LHIV2,LT,V2)
  320. 200    CONTINUE
  321.     CALL TEST(LOGTYP,LFLAG,V1,V2)
  322.     IF(LFLAG.EQ.0)GOTO 700
  323. C HERE HAVE "TRUE" ALTERNATIVE OF IF STMT
  324.     KKK=ICHAR('|')
  325.     LBAR=INDX(LINE,KKK)
  326.     LBAR=MIN0(LBAR,LLAST)
  327.     LSTM=LRB+1
  328. C LSTM TO LBAR IS NOW THE STMT TO EVALUATE. SINCE WE ALREADY HAVE A
  329. C ROUTINE TO EVALUATE A STMT, DO SO. NOTE PARTIAL RECURSION, SO
  330. C NO NESTED IFS ALLOWED, AND CALL MUST PERMIT RECURSION ON YOUR
  331. C MACHINE OR FORGET IT. (OK ON PDP11, VAX).
  332.     LSZ=LBAR-LSTM
  333.     IF(LSZ.LT.1)GOTO 1000
  334.     LSZ=LSZ+1
  335.     CALL DOSTMI(LINE(LSTM),LSZ)
  336.     GOTO 1000
  337. 700    CONTINUE
  338. C HERE HAVE "FALSE" ALTERNATIVE OF IF STMT
  339.     KKK=ICHAR('|')
  340.     LBAR=INDX(LINE,KKK)+1
  341.     LBAR=MIN0(LBAR,LLAST)
  342.     LSZ=LLAST-LBAR
  343.     IF(LSZ.LT.1)GOTO 1000
  344.     LSZ=LSZ+1
  345.     CALL DOSTMI(LINE(LBAR),LSZ)
  346. 1000    CONTINUE
  347. C THAT'S ALL.
  348.     RETURN
  349.     END
  350. c -h- domath.fms    Fri Aug 22 13:03:28 1986    
  351.     SUBROUTINE DOMATH(INDEXF,VAR,AC,SS,CTR,ACX)
  352. C COPYRIGHT (C) 1985, 1986 GLENN C.EVERHART
  353. C ALL RIGHTS RESERVED
  354. C    EXTERNAL INDX
  355.     REAL*8 AC,SS,CTR,ACX,RWRK1,RWRK2
  356.     DIMENSION EP(20)
  357.     InTeGer*4 DLFG
  358. C    COMMON/DLFG/DLFG
  359.     InTeGer*4 KDRW,KDCL
  360. C    COMMON/DOT/KDRW,KDCL
  361.     InTeGer*4 DTRENA
  362. C    COMMON/DTRCMN/DTRENA
  363.     REAL*8 EP,PV,FV
  364.     DIMENSION EP(20)
  365.     INTEGER*4 KIRR
  366. C    COMMON/ERNPER/EP,PV,FV,KIRR
  367.     InTeGer*4 LASTOP
  368. C    COMMON/ERROR/LASTOP
  369.     CHARACTER*1 FMTDAT(9,76)
  370. C    COMMON/FMTBFR/FMTDAT
  371.     CHARACTER*1 EDNAM(16)
  372. C    COMMON/EDNAM/EDNAM
  373.     InTeGer*4 MFID(2),MFMOD(2)
  374. C    COMMON/FRM/MFID,MFMOD
  375.     InTeGer*4 JMVFG,JMVOLD
  376. C    COMMON/FUBAR/JMVFG,JMVOLD
  377.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  378.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  379. CCC    REAL*8 EP,PV,FV
  380. CCC    COMMON/ERNPER/EP,PV,FV,KIRR
  381.     REAL*8 VAR,TE
  382.     INTEGER*4 IWRK1,IWRK2,IDUM
  383.     LOGICAL*4 LWRK1,LWRK2,LWRK3
  384.     INTEGER*4 IWRK3
  385.     EQUIVALENCE(IWRK1,LWRK1),(IWRK2,LWRK2),(IWRK3,LWRK3)
  386.     InTeGer*4 ICREF,IRREF
  387. C    COMMON/MIRROR/ICREF,IRREF
  388.     InTeGer*4 MODPUB,LIMODE
  389. C    COMMON/MODPUB/MODPUB,LIMODE
  390.     InTeGer*4 KLKC,KLKR
  391.     REAL*8 AACP,AACQ
  392. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  393.     InTeGer*4 NCEL,NXINI
  394. C    COMMON/NCEL/NCEL,NXINI
  395.     CHARACTER*1 NAMARY(20,301)
  396. C    COMMON/NMNMNM/NAMARY
  397.     InTeGer*4 NULAST,LFVD
  398. C    COMMON/NULXXX/NULAST,LFVD
  399.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  400.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  401. CCC    REAL*8 AACP,AACQ
  402. CCC    InTeGer*4 KLKC,KLKR
  403. CCC    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  404.     IF(INDEXF.NE.1)GOTO 100
  405. C MIN
  406.     IF(VAR.GE.AC)GOTO 105
  407.     AC=VAR
  408.     AACP=KLKC
  409.     AACQ=KLKR
  410. 105    CONTINUE
  411.     ACX=AC
  412.     RETURN
  413. 100    IF(INDEXF.NE.2)GOTO 200
  414. C MAX
  415.     IF(VAR.LE.AC)GOTO 107
  416.     AC=VAR
  417.     AACP=KLKC
  418.     AACQ=KLKR
  419. 107    CONTINUE
  420. C    IF(VAR.GT.AC)AC=VAR
  421.     ACX=AC
  422.     RETURN
  423. 200    IF(INDEXF.NE.3)GOTO 300
  424. C AVG
  425.     AC=AC+VAR
  426.     CTR=CTR+1.
  427.     ACX=AC/CTR
  428.     RETURN
  429. 300    IF(INDEXF.NE.4)GOTO 400
  430. C SUM
  431.     AC=AC+VAR
  432.     ACX=AC
  433.     RETURN
  434. 400    IF(INDEXF.NE.5)GOTO 500
  435. C STD (STANDARD DEVIATION SQUARED)
  436.     AC=AC+VAR
  437.     SS=SS+(VAR*VAR)
  438.     CTR=CTR+1.
  439.     ACX=(SS-((AC*AC)/CTR))/CTR
  440.     RETURN
  441. 500    CONTINUE
  442.     IF(INDEXF.NE.7)GOTO 600
  443. C AND
  444.     IF(SS.NE.0.)IWRK1=AC
  445.     IF(SS.EQ.0.)IWRK1=VAR
  446.     SS=1.
  447.     IWRK2=VAR
  448.     LWRK1=LWRK1.AND.LWRK2
  449.     AC=IWRK1
  450.     ACX=AC
  451.     RETURN
  452. 600    IF(INDEXF.NE.8)GOTO 700
  453. C INCLUSIVE OR
  454.     IWRK1=AC
  455.     IWRK2=VAR
  456.     LWRK1=LWRK1.OR.LWRK2
  457.     AC=IWRK1
  458.     ACX=AC
  459.     RETURN
  460. 700    IF (INDEXF.NE.9)GOTO 800
  461. C NOT
  462.     IWRK1=VAR
  463.     LWRK1=.NOT.LWRK1
  464.     AC=IWRK1
  465.     ACX=AC
  466.     RETURN
  467. 800    IF(INDEXF.NE.10)GOTO 1000
  468. C CNT
  469. C COUNT NONZERO ENTRIES
  470.     IF(VAR.NE.0.)AC=AC+1.
  471.     ACX=AC
  472.     RETURN
  473. 1000    CONTINUE
  474.     IF(INDEXF.NE.11)GOTO 1100
  475. C NPV
  476.     IF(SS.EQ.0.)GOTO 1050
  477.     CTR=CTR+1.
  478. C    AC=AC+VAR*CTR/SS
  479.     AC=AC+VAR/(SS**(CTR-1))
  480.     ACX=AC
  481.     RETURN
  482. C    GOTO 1200
  483. 1050    CONTINUE
  484.     SS=VAR+1.
  485.     ACX=0.
  486.     RETURN
  487. 1100    if(indexf.ne.12) GOTO 1200
  488. C LKP
  489.     IF(SS.NE.0.)GOTO 1150
  490.     SS=1.
  491.     AC=VAR
  492.     ACX=-1.
  493.     RETURN
  494. C    GOTO 1200
  495. 1150    CONTINUE
  496. C    IF(VAR.GE.AC.AND.ACX.LT.0.)ACX=CTR
  497.     IF(VAR.LT.AC.OR.ACX.GE.0.)GOTO 1155
  498.     ACX=CTR
  499.     AACP=KLKC
  500.     AACQ=KLKR
  501. 1155    CONTINUE
  502.     CTR=CTR+1.
  503.     RETURN
  504. 1200    CONTINUE
  505.     IF(INDEXF.NE.13)GOTO 1300
  506. C LKN
  507.     IF(SS.NE.0.)GOTO 1250
  508.     SS=1.
  509.     AC=VAR
  510.     ACX=-1.
  511.     GOTO 1300
  512. 1250    CONTINUE
  513. C    IF(VAR.LE.AC.AND.ACX.LT.0.)ACX=CTR
  514.     IF(VAR.GT.AC.OR.ACX.GT.0.)GOTO 1256
  515.     ACX=CTR
  516.     AACP=KLKC
  517.     AACQ=KLKR
  518. 1256    CONTINUE
  519.     CTR=CTR+1.
  520.     RETURN
  521. 1300    CONTINUE
  522.     IF(INDEXF.NE.14)GOTO 1400
  523. C LKE
  524.     IF(SS.NE.0.)GOTO 1350
  525.     SS=1.
  526.     AC=VAR
  527.     ACX=-1.
  528.     GOTO 1400
  529. 1350    CONTINUE
  530. C    IF(VAR.EQ.AC.AND.ACX.LT.0.)ACX=CTR
  531.     IF(VAR.NE.AC.OR.ACX.GE.0.)GOTO 1355
  532.     ACX=CTR
  533.     AACP=KLKC
  534.     AACQ=KLKR
  535. 1355    CONTINUE
  536.     CTR=CTR+1.
  537.     RETURN
  538. 1400    CONTINUE
  539.     IF(INDEXF.NE.15)GOTO 1500
  540. C XOR
  541.     IF(SS.NE.0)IWRK1=AC
  542.     IF(SS.EQ.0)IWRK1=VAR
  543.     SS=SS+1.
  544.     IF(SS.EQ.1.)GOTO 1405
  545.     IWRK2=VAR
  546.     LWRK3=LWRK1.OR.LWRK2
  547.     LWRK1=LWRK1.AND.LWRK2
  548.     IWRK1=IWRK3-IWRK1
  549. 1405    AC=IWRK1
  550.     ACX=AC
  551.     RETURN
  552. 1500    CONTINUE
  553.     IF(INDEXF.NE.16)GOTO 1600
  554. C EQV
  555. C NOTE THE EQUIVALENCE FUNCTION IS JUST THE COMPLEMENT OF
  556. C THE XOR FUNCTION. DO THE COMPLEMENT VIA THE .NOT. OPERATOR.
  557.     IF(SS.NE.0)IWRK1=AC
  558.     IF(SS.EQ.0)IWRK1=VAR
  559.     SS=SS+1.
  560.     IF(SS.EQ.1.)GOTO 1505
  561.     IWRK2=VAR
  562.     LWRK3=LWRK1.OR.LWRK2
  563.     LWRK1=LWRK1.AND.LWRK2
  564.     IWRK1=IWRK3-IWRK1
  565.     LWRK1=.NOT.LWRK1
  566. 1505    AC=IWRK1
  567.     ACX=AC
  568.     RETURN
  569. 1600    CONTINUE
  570.     IF(INDEXF.NE.17)GOTO 1700
  571. C MOD
  572. C MODULO (V1 MOD V2)
  573.     IF(SS.NE.0)RWRK1=AC
  574.     IF(SS.EQ.0)RWRK1=VAR
  575.     SS=SS+1.
  576.     IF(SS.EQ.1.)GOTO 1605
  577.     RWRK2=VAR
  578.     RWRK1=DMOD(RWRK1,RWRK2)
  579. 1605    AC=RWRK1
  580.     ACX=AC
  581.     RETURN
  582. 1700    CONTINUE
  583.     IF(INDEXF.NE.18)GOTO 1800
  584. C REMAINDER -- INTEGER MODULO
  585.     IF(SS.NE.0)IWRK1=AC
  586.     IF(SS.EQ.0)IWRK1=VAR
  587.     SS=SS+1.
  588.     IF(SS.EQ.1.)GOTO 1705
  589.     IWRK2=VAR
  590.     IWRK1=JMOD(IWRK1,IWRK2)
  591. 1705    AC=IWRK1
  592.     ACX=AC
  593.     RETURN
  594. 1800    CONTINUE
  595.     IF(INDEXF.NE.19)GOTO 1900
  596. C SGN
  597. C RETURN 1.0 * SIGN OF ARGUMENT.
  598.     AC=DSIGN(1.0D0,VAR)
  599.     ACX=AC
  600.     RETURN
  601. 1900    CONTINUE
  602.     IF(INDEXF.NE.20)GOTO 2000
  603. C IRR - INTERNAL RATE OF RETURN
  604.     AC=0.
  605.     ACX=0.
  606.     IF(KIRR.LT.20)KIRR=KIRR+1
  607.     IF(KIRR.EQ.1)PV=VAR
  608.     IF(KIRR.EQ.2)FV=VAR
  609.     IF(KIRR.LT.3)RETURN
  610. C IRRPV,FV,RETURNS...
  611.     IWRK1=KIRR-2
  612.     EP(IWRK1)=VAR
  613.     RWRK1=.15
  614.     RWRK2=.25
  615. C ITERATIVELY SOLVE FOR INTERNAL RATE OF RETURN.
  616. 1903    TE=0.
  617.     SS=FV/((1.D0+RWRK1)**(IWRK1))
  618.     DO 1905 IWRK2=1,IWRK1
  619.     AC=EP(IWRK2)/((1.D0+RWRK1)**IWRK2)
  620.     SS=SS+AC
  621. 1905    CONTINUE
  622.     RWRK2=RWRK1*(SS+TE)/PV
  623.     IF(DABS(RWRK1-RWRK2).LT..00001)GOTO 1910
  624.     RWRK1=RWRK2
  625.     GOTO 1903
  626. 1910    CONTINUE
  627.     AC=RWRK2
  628.     ACX=AC
  629.     RETURN
  630. 2000    CONTINUE
  631.     IF(INDEXF.NE.21)GOTO 2100
  632. C RND[] - RANDOM NUMBER RETURN
  633.     AC=RND(IDUM)
  634.     ACX=AC
  635.     RETURN
  636. 2100    CONTINUE
  637.        IF(INDEXF.NE.22)GOTO 2200
  638. C PMT FUNCTION
  639. C PMT[PRINCIPAL, INTEREST, NPERIODS] ARE ARGS
  640. C PAYMENT (MORTGAGE PAYMENT PER PERIOD
  641. C COMPUTED AS PAYMENT=PRINCIPAL*(INTEREST/(1-(1+INTEREST)**NPERIODS))
  642. C (CORRECT EVEN IF INTEREST=0
  643. C (REUSE COUNTER USED IN IRR ARGUMENTS HERE)
  644.     AC=0.
  645.     ACX=0.
  646.     KIRR=KIRR+1
  647.     EP(KIRR)=VAR
  648.     IF(KIRR.LT.3)RETURN
  649. C FIRST GET ALL THE INPUTS, THEN DO THE REAL RESULT.
  650.     AC=EP(1)*(EP(2)/(1.-((1.+EP(2))**(-EP(3)))))
  651.     ACX=AC
  652.     RETURN
  653. 2200    CONTINUE
  654.     IF(INDEXF.NE.23)GOTO 2300
  655. C PVL FUNCTION
  656. C PVL[PAYMENT,INTEREST,NPERIODS] ARE ARGS
  657. C PRESENT VALUE COMPUTED AS
  658. C PV=PAYMENT*(1.-(1.+INTEREST)**-NPERIODS)/INTEREST
  659. C (REUSE COUNTER USED IN IRR ARGUMENTS HERE)
  660.     AC=0.
  661.     ACX=0.
  662.     KIRR=KIRR+1
  663.     EP(KIRR)=VAR
  664.     IF(KIRR.LT.3)RETURN
  665. C FIRST GET ALL THE INPUTS, THEN DO THE REAL RESULT.
  666.     AC=EP(1)*EP(3)
  667.     IF(EP(3).EQ.0..OR.EP(2).EQ.0.)GOTO 2205
  668.     AC=EP(1)*((1.-(1.+EP(2))**(-EP(3)))/EP(2))
  669. 2205    ACX=AC
  670.     RETURN
  671. 2300    CONTINUE
  672.     IF(INDEXF.NE.24)GOTO 2400
  673. C AVE AVERAGE EXCLUDING ZERO CELLS
  674.     IF(VAR.EQ.0.)GOTO 2305
  675.     AC=AC+VAR
  676.     CTR=CTR+1.
  677. 2305    ACX=AC/DMAX1(CTR,1.0D0)
  678.     RETURN
  679. 2400    CONTINUE
  680.     IF(INDEXF.NE.25)GOTO 2500
  681. C CHS
  682. C CHOOSE FROM ARGS USING 1ST ARG AS COUNT INTO RANGE...
  683. C (SIMILAR TO CLASSICAL "CHOOSE" FUNCTION...)
  684. C RETURNS 0.0 OR VALUE OF NTH ARG WHERE N IS INDEX OF ARG...
  685. C    IF(KIRR.EQ.0)ACX=0.
  686.     KIRR=KIRR+1
  687.     IF(KIRR.EQ.1)IWRK1=VAR+1.
  688.     IF(KIRR.NE.IWRK1)GOTO 2450
  689. C SAVE LOCATION ALSO OF CELLS.
  690. C THIS ALLOWS US TO FIND ADDRESSES OF SELECTED CELLS IN CHOOSE FOR ADDRESS MATH.
  691.     AACP=KLKC
  692.     AACQ=KLKR
  693.     SS=VAR
  694. 2450    CONTINUE
  695.     ACX=SS
  696.     AC=ACX
  697.     RETURN
  698. 2500    CONTINUE
  699.     IF(INDEXF.NE.26)GOTO 2600
  700. C ATM ARCTAN OF 2 ARGS
  701.     IF(SS.NE.0.)RWRK1=AC
  702.     IF(SS.EQ.0.)RWRK1=VAR
  703.     SS=SS+1.
  704.     IF(SS.LE.1.1)GOTO 2505
  705.     RWRK2=VAR
  706. C GET 4 QUADRANT ARCTAN
  707.     RWRK1=DATAN2(RWRK1,RWRK2)
  708. 2505    AC=RWRK1
  709.     ACX=AC
  710.     RETURN
  711. 2600    CONTINUE
  712.     RETURN
  713.     END
  714. c -h- domfcn.for    Fri Aug 22 13:03:40 1986    
  715.     SUBROUTINE DOMFCN(LINE,LLB,LRB,INDEXF,ACX)
  716. C LLB = LOC OF
  717. C LRB = LOC OF
  718. C INDEXF IS AS ABOVE. GUARANTEED IN RANGE 1-5.
  719.     CHARACTER*1 LINE(110)
  720. C +++++++++++++++++++++++++++++++++++
  721. C PARAMETER 18060=60*301
  722.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  723.     EXTERNAL INDX
  724.     INTEGER*4 VNLT
  725.     DIMENSION FORM(128),FVLD(1,1)
  726. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  727. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  728. C SO INITIALLY IGNORE.
  729. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  730. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  731.     InTeGer*4 RRWACT,RCLACT
  732. C    COMMON/RCLACT/RRWACT,RCLACT
  733.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  734.      1  IDOL7,IDOL8
  735. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  736. C     1  IDOL7,IDOL8
  737.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  738. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  739.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  740. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  741. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  742. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  743.     InTeGer*4 KLVL
  744. C    COMMON/KLVL/KLVL
  745.     InTeGer*4 IOLVL,IGOLD
  746. C    COMMON/IOLVL/IOLVL
  747. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  748. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  749.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  750.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  751.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  752.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  753.     COMMON/D2R/NRDSP,NCDSP
  754.     InTeGer*4 TYPE(1,1),VLEN(9)
  755.     REAL*8 XVBLS(1,1)
  756.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  757.     INTEGER*4 JVBLS(2,1,1)
  758.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  759.     REAL*8 XXX
  760.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  761.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  762.     REAL*8 ACX,ACY
  763.     REAL*8 AC,SS,CTR
  764.     EQUIVALENCE(ACY,AVBLS(1,27))
  765.     InTeGer*4 DLFG
  766. C    COMMON/DLFG/DLFG
  767.     InTeGer*4 KDRW,KDCL
  768. C    COMMON/DOT/KDRW,KDCL
  769.     InTeGer*4 DTRENA
  770. C    COMMON/DTRCMN/DTRENA
  771.     REAL*8 EP,PV,FV
  772.     DIMENSION EP(20)
  773.     INTEGER*4 KIRR
  774. C    COMMON/ERNPER/EP,PV,FV,KIRR
  775.     InTeGer*4 LASTOP
  776. C    COMMON/ERROR/LASTOP
  777.     CHARACTER*1 FMTDAT(9,76)
  778. C    COMMON/FMTBFR/FMTDAT
  779.     CHARACTER*1 EDNAM(16)
  780. C    COMMON/EDNAM/EDNAM
  781.     InTeGer*4 MFID(2),MFMOD(2)
  782. C    COMMON/FRM/MFID,MFMOD
  783.     InTeGer*4 JMVFG,JMVOLD
  784. C    COMMON/FUBAR/JMVFG,JMVOLD
  785.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  786.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  787. CCC    InTeGer*4 KDRW,KDCL
  788. CCC    COMMON /DOT/KDRW,KDCL
  789.     CHARACTER*1 ILINE(106)
  790.     InTeGer*4 ILNFG,ILNCT
  791.     COMMON/ILN/ILNFG,ILNCT,ILINE
  792.     COMMON/FVLDC/FVLD
  793.     InTeGer*4 ICREF,IRREF
  794. C    COMMON/MIRROR/ICREF,IRREF
  795.     InTeGer*4 MODPUB,LIMODE
  796. C    COMMON/MODPUB/MODPUB,LIMODE
  797.     InTeGer*4 KLKC,KLKR
  798.     REAL*8 AACP,AACQ
  799. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  800.     InTeGer*4 NCEL,NXINI
  801. C    COMMON/NCEL/NCEL,NXINI
  802.     CHARACTER*1 NAMARY(20,301)
  803. C    COMMON/NMNMNM/NAMARY
  804.     InTeGer*4 NULAST,LFVD
  805. C    COMMON/NULXXX/NULAST,LFVD
  806.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  807.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  808. CCC    InTeGer*4 KLKC,KLKR
  809.     REAL*8 ACP,ACQ
  810. CCC    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  811.     EQUIVALENCE(ACP,AVBLS(1,16)),(ACQ,AVBLS(1,17))
  812. C +++++++++++++++++++++++++++++++++++
  813. C
  814. C FIRST GET A VARIABLE NAME. ALL MATH FUNCTIONS REQUIRE VARIABLE
  815. C NAMES SINCE THEIR VARIABLES ARE THEIR ONLY VALID ARGS.
  816.     CALL MTHINI(INDEXF,AC,SS,CTR,ACX)
  817. C SET UP PROPER INITS
  818. C KV2=1 IF A 2ND VBL EXISTS
  819.     LCR=LLB+1
  820.     AACP=ACP
  821.     AACQ=ACQ
  822. C INIT SAVED P, Q AC'S HERE IN CASE DOMATH MODIFIES...
  823. C THIS ALLOWS SELECTION FUNCTIONS TO SET COL, ROW IN P AND Q AC.
  824. 100    CONTINUE
  825.     KV2=0
  826.     LB=LCR
  827.     LE=LRB-1
  828.     IF(LB.GE.LE)RETURN
  829.     CALL VARSCN(LINE,LB,LE,LASST,ID1,ID2,IVALID)
  830.     IF(IVALID.EQ.0)RETURN
  831.     IF(LINE(LASST).NE.':')GOTO 110
  832.     LB=LASST+1
  833.     LE=LRB-1
  834.     CALL VARSCN(LINE,LB,LE,LASST,ID1B,ID2B,IVALID)
  835.     IF(IVALID.NE.0)KV2=1
  836. 110    CONTINUE
  837.     CALL XVBLGT(ID1,ID2,XVBLS(1,1))
  838.     XXX=XVBLS(1,1)
  839. C    XXX=XVBLS(ID1,ID2)
  840.     CALL TYPGET(ID1,ID2,TYPE(1,1))
  841. C USE EQUIVALENCE OF JVBLS AND XVBLS
  842.     IF(IABS(TYPE(1,1)).NE.2)XXX=JVBLS(1,1,1)
  843.     KLKC=ID1
  844.     KLKR=ID2-1
  845.     CALL DOMATH(INDEXF,XXX,AC,SS,CTR,ACX)
  846.     IF(KV2.EQ.0)GOTO 200
  847.     IF(ID1.NE.ID1B) GOTO 120
  848.     IF(ID2.GT.ID2B)GOTO 200
  849.     M=ID2+1
  850.     DO 121 MM=M,ID2B
  851.     CALL XVBLGT(ID1,MM,XVBLS(1,1))
  852.     XXX=XVBLS(1,1)
  853.     CALL TYPGET(ID1,MM,TYPE(1,1))
  854. C    XXX=XVBLS(ID1,MM)
  855.     IF(IABS(TYPE(1,1)).NE.2)XXX=JVBLS(1,1,1)
  856.     KLKC=ID1
  857.     KLKR=MM-1
  858.     CALL DOMATH(INDEXF,XXX,AC,SS,CTR,ACX)
  859. 121    CONTINUE
  860.     GOTO 200
  861. 120    CONTINUE
  862.     IF(ID2.NE.ID2B)GOTO 130
  863.     IF(ID1.GT.ID1B)GOTO 200
  864.     M=ID1+1
  865.     DO 131 MM=M,ID1B
  866.     CALL XVBLGT(MM,ID2,XVBLS(1,1))
  867.     XXX=XVBLS(1,1)
  868. C    XXX=XVBLS(MM,ID2)
  869.     CALL TYPGET(MM,ID2,TYPE(1,1))
  870.     IF(IABS(TYPE(1,1)).NE.2)XXX=JVBLS(1,1,1)
  871.     KLKC=MM
  872.     KLKR=ID2-1
  873.     CALL DOMATH(INDEXF,XXX,AC,SS,CTR,ACX)
  874. 131    CONTINUE
  875. 130    CONTINUE
  876. 200    CONTINUE
  877. C IF NEXT CHAR IS A COMMA, SKIP IT AND KEEP UP SCAN UNLESS DONE
  878.     IF(LINE(LASST).EQ.',')GOTO 300
  879.     ACP=AACP
  880.     ACQ=AACQ
  881. C USE P, Q ACCUMULATORS FOR SELECTED COL, ROW COORDS FROM DOMATH
  882.     RETURN
  883. 300    LCR=LASST+1
  884.     GOTO 100
  885.     END
  886. c -h- dostmi.for    Fri Aug 22 13:03:55 1986    
  887.     SUBROUTINE DOSTMI(LINE,LLAST)
  888. C COPY OF DOSTMT FOR IF FUNCTION.
  889. C HANDLE 1 STATEMENT PARSING (DOES A BIT MORE OF THE WORK WITH THE
  890. C PART OF THE LINE STRIPPED TO HAVE EXACTLY ONE COMMAND IN IT.
  891.     CHARACTER*1 LINE(110)
  892. C +++++++++++++++++++++++++++++++++++
  893. C PARAMETER 18060=60*301
  894.     EXTERNAL INDX
  895.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  896.     INTEGER*4 VNLT
  897.     DIMENSION FORM(128),FVLD(1,1)
  898. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  899. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  900. C SO INITIALLY IGNORE.
  901.     COMMON/FVLDC/FVLD
  902. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  903. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  904.     InTeGer*4 RRWACT,RCLACT
  905. C    COMMON/RCLACT/RRWACT,RCLACT
  906.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  907.      1  IDOL7,IDOL8
  908. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  909. C     1  IDOL7,IDOL8
  910.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  911. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  912.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  913. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  914. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  915. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  916.     InTeGer*4 KLVL
  917. C    COMMON/KLVL/KLVL
  918.     InTeGer*4 IOLVL,IGOLD
  919. C    COMMON/IOLVL/IOLVL
  920. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  921. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  922.  
  923.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  924.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  925.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  926.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  927.     COMMON/D2R/NRDSP,NCDSP
  928.     InTeGer*4 TYPE(1,1),VLEN(9)
  929.     REAL*8 XVBLS(1,1)
  930.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  931.     INTEGER*4 JVBLS(2,1,1)
  932.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  933.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  934.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  935.     REAL*8 ACX,ACY,AACY
  936.     INTEGER*4 IACY,IIJACY
  937.     EQUIVALENCE(IIJACY,AACY)
  938.     EQUIVALENCE(IACY,AVBLS(1,27))
  939.     EQUIVALENCE(ACY,AVBLS(1,27))
  940.     InTeGer*4 DLFG
  941. C    COMMON/DLFG/DLFG
  942.     InTeGer*4 KDRW,KDCL
  943. C    COMMON/DOT/KDRW,KDCL
  944.     InTeGer*4 DTRENA
  945. C    COMMON/DTRCMN/DTRENA
  946.     REAL*8 EP,PV,FV
  947.     DIMENSION EP(20)
  948.     INTEGER*4 KIRR
  949. C    COMMON/ERNPER/EP,PV,FV,KIRR
  950.     InTeGer*4 LASTOP
  951. C    COMMON/ERROR/LASTOP
  952.     CHARACTER*1 FMTDAT(9,76)
  953. C    COMMON/FMTBFR/FMTDAT
  954.     CHARACTER*1 EDNAM(16)
  955. C    COMMON/EDNAM/EDNAM
  956.     InTeGer*4 MFID(2),MFMOD(2)
  957. C    COMMON/FRM/MFID,MFMOD
  958.     InTeGer*4 JMVFG,JMVOLD
  959. C    COMMON/FUBAR/JMVFG,JMVOLD
  960.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  961.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  962. CCC    InTeGer*4 KDRW,KDCL
  963. CCC    COMMON /DOT/KDRW,KDCL
  964.     CHARACTER*1 ILINE(106)
  965.     InTeGer*4 ILNFG,ILNCT
  966.     COMMON/ILN/ILNFG,ILNCT,ILINE
  967. C +++++++++++++++++++++++++++++++++++
  968.     CALL FNAME(LINE,LLAST,INDEXF)
  969. C ABOVE GETS FUNCTION NAMES.
  970. C    NAME    INDEXF
  971. C    MIN    1
  972. C    MAX    2
  973. C    AVG    3
  974. C    SUM    4
  975. C    STD    5    (STD DEVIATION)
  976. C    IF    6    (IF STMT)
  977. C    AND    7
  978. C    OR    8
  979. C    NOT    9
  980. C    CNT    10 (COUNTS NONZERO ENTRIES)
  981. C    NPV    11 NET PRESENT VALUE
  982. C    LKP    12 LOOKUP IN LIST, GIVE OFFSET 0 BASED
  983. C    LKN    13    LOOKUP NEGATIVE (INVERSE OF LKP)
  984. C    LKE    14    LOOKUP EQUAL
  985. C    XOR    15    EXCLUSIVE OR
  986. C    EQV    16    EQUIVALENCE (TRUE IF BITS EQUAL)
  987. C    MOD    17    V1 MODULO V2
  988. C    REM    18    REMAINDER OF V1/V2
  989. C    SGN    19    SIGN OF V1 (-1.,0., OR +1.)
  990. C    IRR    20    INTERNAL RATE OF RETURN
  991. C USE  AND  TO DELIMIT FUNCTION ARGS.
  992. C *****************************************************************************
  993. C **** NOTE: MAX 20 IS KEPT AS A LITERAL IN NEXTEL ALSO AS FLAG THAT FUNCTION
  994. C **** FAILED TO FIND VALID LITERAL. CHANGE THERE TOO IF YOU ADD MORE FUNCTIONS.
  995.     IF(INDEXF.LT.1.OR.INDEXF.GT.26)GOTO 1000
  996. C HERE IF A FUNCTION OR AN IF STMT (FORMAT= IF varRELvarstmt|else-stmt)
  997. C
  998. C ALLOW CALC TO HANDLE ALL BUT IF STMTS
  999.     IF(INDEXF.NE.6)GOTO 1000
  1000. C
  1001. C **** FIXUP '' NEXT. 2 LINES. REPLACE HERE... ***
  1002.     KKK=ICHAR('[')
  1003.     LLB=INDX(LINE,KKK)
  1004.     KKK=ICHAR(']')
  1005.     LRB=INDX(LINE,KKK)
  1006. C *** ERROR WITH FORMAT -- NO  SEEN IN TIME. JUST IGNORE IT.
  1007.     IF(LLB.GT.LLAST)RETURN
  1008.     IF(LRB.GT.LLAST)LRB=LLAST
  1009. C ** COMMENT OUT NEVER-USED CODE NEXT AREA...
  1010. C
  1011. C    IF(INDEXF.EQ.6)GOTO 2000
  1012. CC ISOLATE MATH FUNCTIONS
  1013. C    CALL DOMFCN(LINE,LLB,LRB,INDEXF,ACX)
  1014. CC GET % ABOVE
  1015. C    CALL TYPGET(KDRW,KDCL,TYPE(1,1))
  1016. C    IF(IABS(TYPE(1,1)).NE.2)GOTO 1760
  1017. C    CALL XVBLST(KDRW,KDCL,ACX)
  1018. CC    XVBLS(KDRW,KDCL)=ACX
  1019. CC LEAVE RESULT IN % TOO.
  1020. C    ACY=ACX
  1021. C    CALL TYPSET(27,1,TYPE(1,1))
  1022. CC    TYPE(27,1)=TYPE(KDRW,KDCL)
  1023. C    RETURN
  1024. C1760    JVBLS(1,1,1)=ACX
  1025. C    CALL JVBLST(1,KDRW,KDCL,JVBLS(1,1,1))
  1026. CC    JVBLS(1,KDRW,KDCL)=ACX
  1027. C    RETURN
  1028. 2000    CONTINUE
  1029. C HANDLE AN "IF" STATEMENT
  1030. C ILLEGAL HERE INSIDE AN IF, SO JUST IGNORE IT.
  1031. C    CALL DOIF(LINE,LLB,LRB,LLAST)
  1032. C PASS LLAST TO DOIF SINCE WE DON'T EXPECT ] AS LAST CHAR OF STMT.
  1033. C NO DIRECT SET OF VRBL HERE...
  1034.     RETURN
  1035. 1000    CONTINUE
  1036. C HERE JUST HAVE SOMETHING TO PASS TO CALC. DO SO.
  1037.     ILNFG=1
  1038.     LMX=LLAST-1
  1039.     DO 1001 N1=1,LMX
  1040. 1001    ILINE(N1)=LINE(N1)
  1041.     ILNCT=LMX
  1042. C PROTECT CALC FROM ANY PART OF A LINE LONGER THAN 80 CHARS (ITS MAX)
  1043.     IF(ILNCT.GT.80)ILNCT=80
  1044.     CALL CALC
  1045. C STORE EXPRESSION RESULT.
  1046. C CONVERT BETWEEN TYPES FIRST IF NEED BE
  1047.     CALL TYPGET(KDRW,KDCL,LMX)
  1048.     CALL TYPGET(27,1,N1)
  1049.     LMX=IABS(LMX)
  1050.     N1=IABS(N1)
  1051.     IF(N1.EQ.1.OR.(N1.GE.3.AND.N1.LE.8))GOTO 8739
  1052.     N1=2
  1053.     GOTO 8740
  1054. 8739    CONTINUE
  1055.     N1=4
  1056. 8740    CONTINUE
  1057. C ONLY CONCERN HERE IS REAL TYPES (CODE=2) AND INT TYPES (CODE=4)
  1058.     AACY=ACY
  1059.     IF(N1.EQ.LMX)GOTO 2670
  1060.     IF(N1.EQ.2)IIJACY=ACY
  1061.     IF(N1.EQ.4)AACY=IACY
  1062. C DO WHICHEVER CONVERSION IS NEEDED IF ONE IS NEEDED AT ALL.
  1063. 2670    CONTINUE
  1064.     CALL XVBLST(KDRW,KDCL,AACY)
  1065. C    XVBLS(KDRW,KDCL)=ACY
  1066.     RETURN
  1067.     END
  1068. c -h- dostmt.for    Fri Aug 22 13:03:55 1986    
  1069.     SUBROUTINE DOSTMT(LINE,LLAST)
  1070. C HANDLE 1 STATEMENT PARSING (DOES A BIT MORE OF THE WORK WITH THE
  1071. C PART OF THE LINE STRIPPED TO HAVE EXACTLY ONE COMMAND IN IT.
  1072.     CHARACTER*1 LINE(110)
  1073. C +++++++++++++++++++++++++++++++++++
  1074. C PARAMETER 18060=60*301
  1075.     CHARACTER*1 FORM,FVLD,CMDLIN(132)
  1076.     EXTERNAL INDX
  1077.     INTEGER*4 VNLT
  1078.     DIMENSION FORM(128),FVLD(1,1)
  1079. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  1080. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  1081. C SO INITIALLY IGNORE.
  1082.     COMMON/FVLDC/FVLD
  1083.     InTeGer*4 RRWACT,RCLACT
  1084. C    COMMON/RCLACT/RRWACT,RCLACT
  1085.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  1086.      1  IDOL7,IDOL8
  1087. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  1088. C     1  IDOL7,IDOL8
  1089.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  1090. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1091.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1092. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1093. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  1094. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  1095.     InTeGer*4 KLVL
  1096. C    COMMON/KLVL/KLVL
  1097.     InTeGer*4 IOLVL,IGOLD
  1098. C    COMMON/IOLVL/IOLVL
  1099. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  1100. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  1101.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  1102.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  1103.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  1104. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1105. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1106.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  1107.     COMMON/D2R/NRDSP,NCDSP
  1108.     InTeGer*4 TYPE(1,1),VLEN(9)
  1109.     REAL*8 XVBLS(1,1)
  1110.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  1111.     INTEGER*4 JVBLS(2,1,1)
  1112.     EQUIVALENCE(JVBLS(1,1,1),XVBLS(1,1))
  1113.     EQUIVALENCE(VBLS(1,1,1),XVBLS(1,1))
  1114.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  1115.     REAL*8 ACX,ACY,AACY
  1116.     INTEGER*4 IACY,IIJACY
  1117.     EQUIVALENCE(IACY,AVBLS(1,27))
  1118.     EQUIVALENCE(ACY,AVBLS(1,27))
  1119.     EQUIVALENCE(IIJACY,AACY)
  1120.     InTeGer*4 DLFG
  1121. C    COMMON/DLFG/DLFG
  1122.     InTeGer*4 KDRW,KDCL
  1123. C    COMMON/DOT/KDRW,KDCL
  1124.     InTeGer*4 DTRENA
  1125. C    COMMON/DTRCMN/DTRENA
  1126.     REAL*8 EP,PV,FV
  1127.     DIMENSION EP(20)
  1128.     INTEGER*4 KIRR
  1129. C    COMMON/ERNPER/EP,PV,FV,KIRR
  1130.     InTeGer*4 LASTOP
  1131. C    COMMON/ERROR/LASTOP
  1132.     CHARACTER*1 FMTDAT(9,76)
  1133. C    COMMON/FMTBFR/FMTDAT
  1134.     CHARACTER*1 EDNAM(16)
  1135. C    COMMON/EDNAM/EDNAM
  1136.     InTeGer*4 MFID(2),MFMOD(2)
  1137. C    COMMON/FRM/MFID,MFMOD
  1138.     InTeGer*4 JMVFG,JMVOLD
  1139. C    COMMON/FUBAR/JMVFG,JMVOLD
  1140.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  1141.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  1142. CCC    InTeGer*4 KDRW,KDCL
  1143. CCC    COMMON /DOT/KDRW,KDCL
  1144.     CHARACTER*1 ILINE(106)
  1145.     InTeGer*4 ILNFG,ILNCT
  1146.     COMMON/ILN/ILNFG,ILNCT,ILINE
  1147.  
  1148. C +++++++++++++++++++++++++++++++++++
  1149.     CALL FNAME(LINE,LLAST,INDEXF)
  1150. C ABOVE GETS FUNCTION NAMES.
  1151. C    NAME    INDEXF
  1152. C    MIN    1
  1153. C    MAX    2
  1154. C    AVG    3
  1155. C    SUM    4
  1156. C    STD    5    (STD DEVIATION)
  1157. C    IF    6    (IF STMT)
  1158. C    AND    7
  1159. C    OR    8
  1160. C    NOT    9
  1161. C    CNT    10 (COUNTS NONZERO ENTRIES)
  1162. C    NPV    11 NET PRESENT VALUE
  1163. C    LKP    12 LOOKUP IN LIST, GIVE OFFSET 0 BASED
  1164. C    LKN    13    LOOKUP NEGATIVE (INVERSE OF LKP)
  1165. C    LKE    14    LOOKUP EQUAL
  1166. C    XOR    15    EXCLUSIVE OR
  1167. C    EQV    16    EQUIVALENCE (TRUE IF BITS EQUAL)
  1168. C    MOD    17    V1 MODULO V2
  1169. C    REM    18    REMAINDER OF V1/V2
  1170. C    SGN    19    SIGN OF V1 (-1.,0., OR +1.)
  1171. C    IRR    20    INTERNAL RATE OF RETURN
  1172. C    RND    21    RANDOM NUMBER BETWEEN 0 AND 1.
  1173. C    PMT    22    PAYMENT FUNCTION
  1174. C    PVL    23    PRESENT VALUE
  1175. C    AVE    24    AVEREAGE EXCLUDING ZERO CELLS
  1176. C    CHS    25    CHOOSE
  1177. C    ATM    26    ARC TAN OF MULTIPLE ARGS (2 ARGS)
  1178. C USE  AND  TO DELIMIT FUNCTION ARGS.
  1179. C *****************************************************************************
  1180. C **** NOTE: MAX 26 IS KEPT AS A LITERAL IN NEXTEL ALSO AS FLAG THAT FUNCTION
  1181. C **** FAILED TO FIND VALID LITERAL. CHANGE THERE TOO IF YOU ADD MORE FUNCTIONS.
  1182.     IF(INDEXF.LT.1.OR.INDEXF.GT.26)GOTO 1000
  1183. C HERE IF A FUNCTION OR AN IF STMT (FORMAT= IF varRELvarstmt|else-stmt)
  1184. C
  1185. C ALLOW CALC TO HANDLE ALL BUT IF STMTS
  1186.     IF(INDEXF.NE.6)GOTO 1000
  1187. C
  1188.     KKK=ICHAR('[')
  1189.     LLB=INDX(LINE,KKK)
  1190.     KKK=ICHAR(']')
  1191.     LRB=INDX(LINE,KKK)
  1192. C *** ERROR WITH FORMAT -- NO  SEEN IN TIME. JUST IGNORE IT.
  1193.     IF(LLB.GT.LLAST)RETURN
  1194.     IF(LRB.GT.LLAST)LRB=LLAST
  1195. C *** NOTA BENE
  1196. C NEXT STUFF COMMENTED BECAUSE WE CAN NEVER EXECUTE IT...
  1197. C    IF(INDEXF.EQ.6)GOTO 2000
  1198. CC ISOLATE MATH FUNCTIONS
  1199. C    CALL DOMFCN(LINE,LLB,LRB,INDEXF,ACX)
  1200. CC GET % ABOVE
  1201. C    CALL TYPGET(KDRW,KDCL,TYPE(1,1))
  1202. C    IF(IABS(TYPE(1,1)).NE.2)GOTO 1760
  1203. C    CALL XVBLST(KDRW,KDCL,ACX)
  1204. CC    XVBLS(KDRW,KDCL)=ACX
  1205. CC LEAVE RESULT IN % TOO.
  1206. C    ACY=ACX
  1207. C    CALL TYPSET(27,1,TYPE(1,1))
  1208. CC    TYPE(27,1)=TYPE(KDRW,KDCL)
  1209. C    RETURN
  1210. C1760    JVBLS(1,1,1)=ACX
  1211. C    CALL JVBLST(1,KDRW,KDCL,JVBLS(1,1,1))
  1212. CC    JVBLS(1,KDRW,KDCL)=ACX
  1213. C    RETURN
  1214. 2000    CONTINUE
  1215. C HANDLE AN "IF" STATEMENT
  1216.     CALL DOIF(LINE,LLB,LRB,LLAST)
  1217. C PASS LLAST TO DOIF SINCE WE DON'T EXPECT  AS LAST CHAR OF STMT.
  1218. C NO DIRECT SET OF VRBL HERE...
  1219.     RETURN
  1220. 1000    CONTINUE
  1221. C HERE JUST HAVE SOMETHING TO PASS TO CALC. DO SO.
  1222.     ILNFG=1
  1223.     LMX=LLAST-1
  1224.     DO 1001 N1=1,LMX
  1225. 1001    ILINE(N1)=LINE(N1)
  1226.     ILNCT=LMX
  1227. C PROTECT CALC FROM ANY PART OF A LINE LONGER THAN 80 CHARS (ITS MAX)
  1228.     IF(ILNCT.GT.80)ILNCT=80
  1229.     CALL CALC
  1230. C STORE EXPRESSION RESULT.
  1231. C FIRST BE SURE STORING RIGHT TYPE
  1232.     CALL TYPGET(KDRW,KDCL,LMX)
  1233. C ONLY WORRY HERE ABOUT INTEGER VS REAL (INT=4, REAL=2 CODE)
  1234.     CALL TYPGET(27,1,N1)
  1235.     N1=IABS(N1)
  1236.     LMX=IABS(LMX)
  1237. C LET ALL DEFAULT TO TYPE 2 (FLOATING) EXCEPT EXPLICIT INTS
  1238.     IF((N1.EQ.1).OR.(N1.GE.3.AND.N1.LE.8))GOTO 2739
  1239.     N1=2
  1240.     GOTO 2740
  1241. 2739    CONTINUE
  1242.     N1=4
  1243. 2740    CONTINUE
  1244.     AACY=ACY
  1245.     IF((N1).EQ.(LMX))GOTO 2670
  1246. C TYPES DIFFER. CONVERT BETWEEN ACY AND IACY.
  1247.     IF((N1).EQ.4)AACY=IACY
  1248.     IF((N1).EQ.2)IIJACY=ACY
  1249. 2670    CONTINUE
  1250.     CALL XVBLST(KDRW,KDCL,AACY)
  1251. C    XVBLS(KDRW,KDCL)=ACY
  1252.     RETURN
  1253.     END
  1254. c -h- dspfil.for    Fri Aug 22 13:04:12 1986    
  1255.     SUBROUTINE DSPFIL(ICODE,FORM,FORM2,FVLDTP,
  1256.      1  LFTMST,LENTL,LOCOL,FILINE,LLVL,LLU,LLVLF,J)
  1257. C COPYRIGHT (C) 1983 GLENN EVERHART
  1258. C ALL RIGHTS RESERVED
  1259. C DISPLAY SPREAD SHEET ON SCREEN OR IN FILE IF ICODE=10
  1260. C USES UVT100 TO TWEAK THE VT100. NO WRAP IS ASSUMED SO
  1261. C OUTPUT UP TO 132 COLS BY 24 LINES IS OK. ONLY CHECK
  1262. C WIDTH TO ALLOW VT100 LOOKALIKES WITH MORE DISPLAY LINES TOO.
  1263. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  1264. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  1265. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  1266. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  1267. C FROM THE DISK BASED FILE HERE.
  1268. C    CHARACTER*127 CWRK
  1269. C    CHARACTER*1 CCWRK(128)
  1270.     InTeGer*4 ICODE,LFTMST
  1271. C    EQUIVALENCE(CWRK,CCWRK(1))
  1272.     InTeGer*4 LLU,LLVL,LLVLF
  1273.     InTeGer*4 RRWACT,RCLACT
  1274. C    COMMON/RCLACT/RRWACT,RCLACT
  1275.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  1276.      1  IDOL7,IDOL8
  1277. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  1278. C     1  IDOL7,IDOL8
  1279.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  1280. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1281.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1282. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1283. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  1284. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  1285.     InTeGer*4 KLVL
  1286. C    COMMON/KLVL/KLVL
  1287.     InTeGer*4 IOLVL,IGOLD
  1288. C    COMMON/IOLVL/IOLVL
  1289. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  1290. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  1291.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  1292.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  1293.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  1294. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  1295. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  1296.     EXTERNAL INDX
  1297.     CHARACTER*7 PRTLX
  1298.     CHARACTER*1 FORM,FVLD,CMDLIN(132),PRTLIN(132)
  1299.     EQUIVALENCE(PRTLX(1:1),PRTLIN(1))
  1300. C    INTEGER*4 VNLT
  1301.     CHARACTER*1 FVLDTP
  1302.     CHARACTER*1 LBEL(4)
  1303.     CHARACTER*1 LET1,LET2,FORM2(128),NMSH(80)
  1304.     COMMON/NMSH/NMSH
  1305. C FLAG BORDR=1 IF WE WANT TO OMIT BORDERS ON DRAWING
  1306. C THE SCREEN DISPLAY TO A FILE.
  1307.     InTeGer*4 BORDR,TOMT
  1308. C COMMON ICPOS ALLOWS UVT100 ROUTINE ACCESS TO DISPLAYED NUMBERS
  1309. C FOR USES SUCH AS SETTING COLORS...
  1310.     CHARACTER*1 OARRY(100)
  1311.     InTeGer*4 OSWIT,OCNTR
  1312. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  1313. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  1314.     InTeGer*4 IPS1,IPS2,MODFLG
  1315. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  1316.        InTeGer*4 XTCFG,IPSET,XTNCNT
  1317.        CHARACTER*1 XTNCMD(80)
  1318. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  1319. C VARY FLAG ITERATION COUNT
  1320.     INTEGER KALKIT
  1321. C    COMMON/VARYIT/KALKIT
  1322.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  1323.     InTeGer*4 RCMODE,IRCE1,IRCE2
  1324. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1325. C     1  IRCE2
  1326. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  1327. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  1328. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  1329. C RCFGX ON.
  1330. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  1331. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  1332. C  AND VM INHIBITS. (SETS TO 1).
  1333.     INTEGER*4 FH
  1334. C FILE HANDLE FOR CONSOLE I/O (RAW)
  1335. C    COMMON/CONSFH/FH
  1336.     CHARACTER*1 ARGSTR(52,4)
  1337. C    COMMON/ARGSTR/ARGSTR
  1338.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  1339.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  1340.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1341.      3  IRCE2,FH,ARGSTR
  1342. CCC    InTeGer*4 IC1POS,IC2POS
  1343. CCC    COMMON/ICPOS/IC1POS,IC2POS
  1344.     REAL*8 XVBLS(1,1),VDSP,VCLC
  1345.     CHARACTER*1 DFE(14)
  1346.     CHARACTER*14 CDFE
  1347.     EQUIVALENCE(CDFE(1:1),DFE(1))
  1348.     DIMENSION FORM(128),FVLD(1,1)
  1349. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  1350. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  1351. C SO INITIALLY IGNORE.
  1352. C
  1353. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  1354. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  1355. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1356. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1357.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  1358.     COMMON/D2R/NRDSP,NCDSP
  1359.     InTeGer*4 ILNFG,ILNCT,RCF
  1360.     CHARACTER*1 ILINE(106)
  1361.     COMMON/ILN/ILNFG,ILNCT,ILINE
  1362.     INTEGER LENTL(5),LOCOL(5)
  1363.     CHARACTER*1 FILINE(208)
  1364. CCC    CHARACTER*1 OARRY(100)
  1365. CCC    InTeGer*4 OSWIT,OCNTR
  1366. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  1367. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  1368.     InTeGer*4 TYPE(1,1),VLEN(9)
  1369.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  1370.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  1371.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  1372. CCC    InTeGer *4 FORMFG,RCFGX
  1373. CCC    COMMON/FFGG/FORMFG,RCFGX
  1374. C
  1375. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  1376. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  1377. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  1378. C DISPLAY ACTUALLY USED FOR SCREEN.
  1379.     InTeGer*4 CWIDS(20)
  1380. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  1381. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  1382. C AS 20 NOT 75.
  1383.     REAL*8 DVS(20,75)
  1384.     INTEGER*4 LDVS(2,20,75)
  1385.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  1386.     COMMON /FVLDC/FVLD
  1387. C    CHARACTER*1 DFMTS(10,20,75)
  1388. C 10 CHARACTERS PER ENTRY.
  1389. C    COMMON/DSPCMN/DVS,DFMTS,CWIDS
  1390.     COMMON/DSPCMN/DVS,CWIDS
  1391. C THISRW,THISCL = CURRENT DISPLAYED LOCS.
  1392.     InTeGer*4 THISRW,THISCL
  1393. C NOTE ROWS ARE DOWN, COLS ACROSS INTERNALLY.
  1394. C COLUMN 2 = NUMBERS. DISPLAY COLS 2-22 WITH COL 1=TITLE
  1395. C COL 23,24 FOR COMMANDS.(23 (PARAMETER) ACTUALLY.)
  1396. C ROW OFFSET BY 6 FOR NUMBERS.
  1397. C
  1398. C MAINTAIN AN "INITIALIZED" BITMAP HERE TO USE TO AVOID GOING TO
  1399. C FVLD.
  1400. C    CHARACTER*1 IBITMP
  1401. C    DIMENSION IBITMP(2258)
  1402. C    COMMON/INITD/IBITMP
  1403. C NOTE BITMAP IS ZEROED IN SPREDSHT MAIN PROGRAM (OR AT SAVE CMD)
  1404. C AND IS SET HERE (AND HERE ONLY). ONLY USED HERE TOO...
  1405. C    character*100 fwt
  1406. C
  1407. C CODE FOR WINDOW TILING AND FILE READIN...
  1408. C &%FILENAME,NSKIP,NLEN READS FILE SKIPPING NSKIP RECS AND
  1409. C GETS NLEN RECS IN
  1410. C
  1411. C &&%FILENAME,NSKIP,NLEN JUST INSERTS FILE INTO PRINTOUT
  1412.     IF(IDOL4.EQ.0)GOTO 9880
  1413.     LFTMST=J
  1414. C NEED TO DO IT HERE...
  1415. C FORM ARRAY HAS FILE NAME INFO, IF ANY...
  1416.     KKK=ICHAR('&')
  1417.     LLA=INDX(FORM,KKK)
  1418.     IF(LLA.LE.0.OR.LLA.GT.100)GOTO 9882
  1419.     IF(FORM(LLA+1).EQ.'&')GOTO 9881
  1420. C CHECK &% FORM
  1421.     IF(FORM(LLA+1).NE.'%')GOTO 9882
  1422. C GOT &% FORM HERE.
  1423.     IF(LLVL.EQ.0.OR.LLVLF.EQ.1)GOTO 9885
  1424.     DO 9886 LNNN=1,LLVL
  1425.     LLVLN=LLVL+10
  1426.     CLOSE(LLVLN)
  1427. 9886    CONTINUE
  1428.     LLVL=0
  1429. 9885    CONTINUE
  1430.     LTST=LLA+2
  1431.     LLVLF=1
  1432. C OPEN LLVL
  1433.     CALL GETFNL(FORM(LTST),LSKIP,LLEN)
  1434.     IF(LLEN.LE.0)GOTO 9882
  1435.     LLVL=LLVL+1
  1436.     LLU=LLVL+10
  1437.     IF(LLVL.GT.4)GOTO 9931
  1438.     CALL RASSIG(LLU,FORM(LTST))
  1439.     GOTO 9930
  1440. 9931    CONTINUE
  1441.     LENTL(LLVL)=0
  1442.     LOCOL(LLVL)=0
  1443.     CLOSE(LLU)
  1444.     LLVL=LLVL-1
  1445.     LLU=LLVL+10
  1446.     GOTO 9882
  1447. 9930    CONTINUE
  1448.     LOCOL(LLVL)=LFTMST
  1449.     LENTL(LLVL)=LLEN
  1450.     IF(LSKIP.LE.0)GOTO 9906
  1451.     DO 9907 LL=1,LSKIP
  1452. 9907    READ(LLU,9889,END=9909,ERR=9909)FILINE
  1453.     DO 9910 N=1,208
  1454. 9910    FILINE(N)=CHAR(32)
  1455.     GOTO 9911
  1456. 9909    CONTINUE
  1457. C EOF SO CLOSE LUN
  1458.     LENTL(LLVL)=0
  1459.     CLOSE(LLU)
  1460.     LLVL=LLVL-1
  1461.     IF(LLVL.LE.0)GOTO 9880
  1462.     LLU=LLVL+10
  1463. 9911    CONTINUE
  1464. 9906    CONTINUE
  1465. C FILE SET UP NOW... READ IN AT 9982...
  1466. C RECORD COL # OVER FOR THIS RECURSION LEVEL
  1467.     GOTO 9882
  1468. 9881    CONTINUE
  1469. C HERE LOOK FOR && FORM. IF NONE SEEN, SKIP THIS
  1470.     IF(FORM(LLA+1).NE.'&'.OR.FORM(LLA+2).NE.'%')GOTO 9882
  1471. C HERE HAVE A FORM &&%FILE,NS,NL
  1472. C SO CLOSE OFF ALL WINDOWS IN USE AND READ IN FIRST LEVEL FILE SEEN.
  1473.     IF(LLVL.EQ.0.OR.LLVLF.EQ.2)GOTO 9884
  1474.     DO 9883 LNN=1,LLVL
  1475.     LNN1=LNN+10
  1476.     CLOSE(LNN1)
  1477. 9883    CONTINUE
  1478. C NOW ALL OPEN UNITS CLOSED
  1479.     LLVLF=2
  1480.     LLVL=0
  1481. 9884    CONTINUE
  1482.     LTST=LLA+3
  1483. C OPEN LLVL
  1484. 9937    CALL GETFNL(FORM(LTST),LSKIP,LLEN)
  1485.     IF(LLEN.LE.0)GOTO 9882
  1486.     LLVL=LLVL+1
  1487.     LLU=LLVL+10
  1488.     IF(LLVL.GT.4)GOTO 9933
  1489. C    OPEN(LLU,NAME=FORM(LTST),TYPE='OLD',
  1490. C     1  ERR=9933)
  1491.     CALL RASSIG(LLU,FORM(LTST))
  1492.     GOTO 9934
  1493. 9933    CONTINUE
  1494.     LLVL=LLVL-1
  1495.     LLU=LLVL+10
  1496.     GOTO 9882
  1497. 9934    CONTINUE
  1498.     LOCOL(LLVL)=LFTMST
  1499.     LENTL(LLVL)=LLEN
  1500.     IF(LSKIP.LE.0)GOTO 9888
  1501.     DO 9887 LL=1,LSKIP
  1502. 9887    READ(LLU,9889,ERR=9901,END=9901)FILINE
  1503. 9889    FORMAT(208A1)
  1504. C8998    FORMAT(1X,208A1)
  1505. 9898    FORMAT(132A1)
  1506.     DO 9908 N=1,208
  1507. 9908    FILINE(N)=Char(32)
  1508. C PUT IN LEADING SPACES INTO FILINE
  1509.     GOTO 9902
  1510. 9901    CONTINUE
  1511.     CLOSE(LLU)
  1512.     LLVL=LLVL-1
  1513.     IF(LLVL.LE.0)GOTO 9880
  1514.     LLU=LLVL+10
  1515. C HIT EOF ON READ, SO BACK UP A LEVEL
  1516. 9902    CONTINUE
  1517. C NOW GO AHEAD & READ... GOT PAST SKIP STUFF.
  1518. 9888    CONTINUE
  1519. C RECORD COL # OVER FOR THIS RECURSION LEVEL
  1520. 9904    IF(LENTL(LLVL).LE.0) GOTO 9901
  1521.     READ(LLU,9889,END=9901,ERR=9901)(FILINE(IV),IV=LOCOL(LLVL),208)
  1522.     LENTL(LLVL)=lentl(llvl)-1
  1523. c update lines left to read in
  1524. C LOOK FOR RECURSIVE CALLS TO DEEPER NESTED FILES TO INCLUDE
  1525.     KKK=ICHAR('&')
  1526.     LTST=INDX(FILINE,KKK)+3
  1527.     LFTMST=LTST-3
  1528. C UPDATE SO IF IT IS A CALL,WE CAN GO HANDLE IT TILL ITS EOF OR A DEEPER CALL
  1529.     IF(LTST.GT.0.AND.LTST.LT.207.AND.FILINE(LTST+1).EQ.'&'
  1530.      1  .AND.FILINE(LTST+2).EQ.'%') GOTO 9937
  1531. C WELL, NOT A DEEPER LEVEL SO JUST GO ON AND READ THIS LEVEL TILL DONE.
  1532.     IF(ICODE.EQ.10)WRITE(8,9889,ERR=9904)FILINE
  1533. c only write 80 chars on ibmpc and its ilk since they screw up on wider.
  1534.     call swrt(filine,80)
  1535. c    WRITE(0,9898,ERR=9904)(FILINE(IVV),IVV=1,132)
  1536.     GOTO 9904
  1537. 9882    CONTINUE
  1538. C HERE HANDLE OLD WINDOW READS IN PROCESS OR JUST EXIT WITHOUT DOING MUCH
  1539.     IF(LLVLF.NE.1)GOTO 9880
  1540. C ONLY HANDLE "OVERLAY" STYLE READS HERE.
  1541. C NORMAL OR-ING IN OF WINDOWS
  1542. C LOOK FOR LUN SUCH THAT J=LOCOL(LUN) INDICATING IT STARTS HERE.
  1543. C READ THIS CELL INTO IT AND FAKE OUT FVLD(1,1) TO GET IT DISPLAYED.
  1544.     IF(LLVL.LE.0)GOTO 9880
  1545.     DO 9912 N=1,LLVL
  1546.     LLM=N+10
  1547.     IF(J.EQ.LOCOL(N))GOTO 9913
  1548. 9912    CONTINUE
  1549.     GOTO 9880
  1550. 9913    CONTINUE
  1551. C NOW READ THE FILE INTO "THIS" CELL (DISPLAY PURPOSES ONLY!)
  1552. C AND FLAG FVLD
  1553.     LENTL(LLM-10)=LENTL(LLM-10)-1
  1554.     IF(LENTL(LLM-10).GT.0)
  1555.      1  READ(LLM,9889,END=9940,ERR=9940)(FORM(IV),IV=1,109)
  1556.     IF(LENTL(LLM-10).GT.0)FVLDTP=-1
  1557.     IF(LENTL(LLM-10).LT.0)GOTO 9940
  1558. C -1 FLAGS THIS AS A "TEXT" CELL DISPLAY.
  1559.     GOTO 9880
  1560. 9940    CONTINUE
  1561.     LENTL(LLM-10)=0
  1562.     LOCOL(LLM-10)=0
  1563.     CLOSE(LLM)
  1564. 9880    CONTINUE
  1565.     RETURN
  1566.     END
  1567. c -h- dspsht.f40    Fri Aug 22 13:04:12 1986    
  1568.     SUBROUTINE DSPSHT(ICODE)
  1569. C COPYRIGHT (C) 1983 GLENN EVERHART
  1570. C ALL RIGHTS RESERVED
  1571. C DISPLAY SPREAD SHEET ON SCREEN OR IN FILE IF ICODE=10
  1572. C USES UVT100 TO TWEAK THE VT100. NO WRAP IS ASSUMED SO
  1573. C OUTPUT UP TO 132 COLS BY 24 LINES IS OK. ONLY CHECK
  1574. C WIDTH TO ALLOW VT100 LOOKALIKES WITH MORE DISPLAY LINES TOO.
  1575. C NOTE: THROUGHOUT, ROWS ARE ACTUALLY DOWN, COLUMNS ACROSS ON
  1576. C SCREEN. ROW 0 IN DISPLAY IS THE 27 ACCUMULATORS A-Z AND %, WITH
  1577. C % BEING THE LAST-COMPUTED VALUE FROM THE CALC PROGRAM, WHICH
  1578. C KNOWS HOW TO ACCESS THE DATA BUT IS JUST PASSED COMMAND STRINGS
  1579. C FROM THE DISK BASED FILE HERE.
  1580.     CHARACTER*127 CWRK
  1581.     CHARACTER*1 CCWRK(128)
  1582.     InTeGer*4 ICODE,LLU,LLVL,LLVLF
  1583.     EQUIVALENCE(CWRK(1:1),CCWRK(1))
  1584.     InTeGer*4 RRWACT,RCLACT
  1585. C    COMMON/RCLACT/RRWACT,RCLACT
  1586.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  1587.      1  IDOL7,IDOL8
  1588. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  1589. C     1  IDOL7,IDOL8
  1590.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  1591. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1592.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1593. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  1594. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  1595. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  1596.     InTeGer*4 KLVL
  1597. C    COMMON/KLVL/KLVL
  1598.     InTeGer*4 IOLVL,IGOLD
  1599. C    COMMON/IOLVL/IOLVL
  1600. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  1601. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  1602.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  1603.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  1604.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  1605. CCC    InTeGer*4 IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  1606. CCC    COMMON/DOLLR/IDOL1,IDOL2,IDOL3,IDOL4,IDOL5,IDOL6
  1607. CCC    InTeGer*4 LLCMD,LLDSP
  1608. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1609. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  1610. C    EXTERNAL INDX
  1611.     CHARACTER*7 PRTLX
  1612.     CHARACTER*1 FORM,FVLD,CMDLIN(132),PRTLIN(132)
  1613.     EQUIVALENCE(PRTLX(1:1),PRTLIN(1))
  1614. C    INTEGER*4 VNLT
  1615.     CHARACTER*1 FVLDTP
  1616.     CHARACTER*1 LBEL(4)
  1617.     CHARACTER*1 LET1,LET2,FORM2(128),NMSH(80)
  1618.     COMMON/NMSH/NMSH
  1619. C FLAG BORDR=1 IF WE WANT TO OMIT BORDERS ON DRAWING
  1620. C THE SCREEN DISPLAY TO A FILE.
  1621.     InTeGer*4 BORDR,TOMT
  1622. C COMMON ICPOS ALLOWS UVT100 ROUTINE ACCESS TO DISPLAYED NUMBERS
  1623. C FOR USES SUCH AS SETTING COLORS...
  1624.     CHARACTER*1 OARRY(100)
  1625.     InTeGer*4 OSWIT,OCNTR
  1626. C    COMMON/OAR/OSWIT,OCNTR,OARRY
  1627. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  1628.     InTeGer*4 IPS1,IPS2,MODFLG
  1629. C    COMMON/ICPOS/IPS1,IPS2,MODFLG
  1630.        InTeGer*4 XTCFG,IPSET,XTNCNT
  1631.        CHARACTER*1 XTNCMD(80)
  1632. C       COMMON/XCMD/XTNCNT,XTNCMD,XTCFG,IPSET
  1633. C VARY FLAG ITERATION COUNT
  1634.     INTEGER KALKIT
  1635. C    COMMON/VARYIT/KALKIT
  1636.     InTeGer*4 FORMFG,RCFGX,PZAP,RCONE
  1637.     InTeGer*4 RCMODE,IRCE1,IRCE2
  1638. C    COMMON/FFGG/FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1639. C     1  IRCE2
  1640. C FORMFG FLAGS FORMAT OF DISPLAY GLOBALLY
  1641. C RCFGX FLAGS WHETHER TO DO AUTO RECALCULATION. IF 1, INHIBITS
  1642. C AUTO RECALC (USE R COMMAND TO DO A CALC.). 17 COMMAND TURNS
  1643. C RCFGX ON.
  1644. C PZAP CONTROLS WHETHER TO REDRAW SCREEN. IF ZERO, NORMAL. IF 1
  1645. C (NONZERO ANYHOW), INHIBITS RE DISPLAY. V COMMAND RESETS TO 0
  1646. C  AND VM INHIBITS. (SETS TO 1).
  1647.     INTEGER*4 FH
  1648. C FILE HANDLE FOR CONSOLE I/O (RAW)
  1649. C    COMMON/CONSFH/FH
  1650.     CHARACTER*1 ARGSTR(52,4)
  1651. C    COMMON/ARGSTR/ARGSTR
  1652.     COMMON/XVXTCD/OSWIT,OCNTR,OARRY,IPS1,IPS2,MODFLG,
  1653.      1  XTNCNT,XTNCMD,XTCFG,IPSET,KALKIT,
  1654.      2  FORMFG,RCFGX,PZAP,RCONE,RCMODE,IRCE1,
  1655.      3  IRCE2,FH,ARGSTR
  1656. CCC    InTeGer*4 IC1POS,IC2POS
  1657. CCC    COMMON/ICPOS/IC1POS,IC2POS
  1658. CCC    InTeGer*4 NULAST,LFVD
  1659. C    INTEGER*4 IOLVL
  1660. C    COMMON/IOLVL/IOLVL
  1661.     InTeGer*4 ICREF,IRREF
  1662. C    COMMON/MIRROR/ICREF,IRREF
  1663.     InTeGer*4 MODPUB,LIMODE
  1664. C    COMMON/MODPUB/MODPUB,LIMODE
  1665.     InTeGer*4 KLKC,KLKR
  1666.     REAL*8 AACP,AACQ
  1667. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  1668.     InTeGer*4 NCEL,NXINI
  1669. C    COMMON/NCEL/NCEL,NXINI
  1670.     CHARACTER*1 NAMARY(20,301)
  1671. C    COMMON/NMNMNM/NAMARY
  1672.     InTeGer*4 NULAST,LFVD
  1673. C    COMMON/NULXXX/NULAST,LFVD
  1674.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  1675.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  1676. CCC    COMMON/NULXXX/NULAST,LFVD
  1677.     REAL*8 XVBLS(1,1),VDSP,VCLC
  1678.     CHARACTER*1 DFE(14)
  1679.     CHARACTER*14 CDFE
  1680.     EQUIVALENCE(CDFE(1:1),DFE(1))
  1681.     DIMENSION FORM(128),FVLD(1,1)
  1682. C FVLD FLAG 0 = NO FORMULA, -1= DISPLAY FORMULA ITSELF, NOT VALUE
  1683. C 1=VALID ACTIVE FORMULA THERE TO EVALUATE. INITIALLY ALL 0'S
  1684. C SO INITIALLY IGNORE.
  1685. C
  1686. C ROUTINE IN2AS COMPUTES ASCII CHARACTER NAMES OF SUBSCRIPTS IN1,IN2
  1687. C SO DISPLAY CAN HAVE THEM. IT MUST BE THE INVERSE OF VARSCN.
  1688. C    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1689. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  1690.     DIMENSION NRDSP(20,75),NCDSP(20,75)
  1691.     COMMON/D2R/NRDSP,NCDSP
  1692.     InTeGer*4 ILNFG,ILNCT,RCF
  1693.     CHARACTER*1 ILINE(106)
  1694.     COMMON/ILN/ILNFG,ILNCT,ILINE
  1695.     INTEGER LENTL(5),LOCOL(5)
  1696.     CHARACTER*1 FILINE(208)
  1697. CCC    CHARACTER*1 OARRY(100)
  1698. CCC    InTeGer*4 OSWIT,OCNTR
  1699. CCC    COMMON/OAR/OSWIT,OCNTR,OARRY
  1700. C COMMON OAR SWITCHES OUTPUT OFF IF OSWIT=2
  1701.     InTeGer*4 TYPE(1,1),VLEN(9)
  1702.     CHARACTER*1 AVBLS(20,27),VBLS(8,1,1)
  1703.     EQUIVALENCE(XVBLS(1,1),VBLS(1,1,1))
  1704.     COMMON/V/TYPE,AVBLS,VBLS,VLEN
  1705. CCC    InTeGer *4 FORMFG,RCFGX
  1706. CCC    COMMON/FFGG/FORMFG,RCFGX
  1707. C
  1708. C DISPLAY ARRAY WILL KEEP A COPY OF VARIABLES DISPLAYED AND FORMATS
  1709. C USED LOCALLY WHICH DISPLAY ROUTINE CAN USE TO SEE WHAT ACTUALLY
  1710. C NEEDS TO BE REFRESHED ON SCREEN. DRWV AND DCLV ARE COLS, ROWS OF
  1711. C DISPLAY ACTUALLY USED FOR SCREEN.
  1712.     InTeGer*4 CWIDS(20)
  1713. C CWIDS IS WIDTHS IN CHARACTERS OF COLUMNS ON DISPLAY. NOTE THAT BECAUSE
  1714. C OF PECULIAR INVERSION WHICH I AM TOO LAZY TO CORRECT IT IS DIMENSIONED
  1715. C AS 20 NOT 75.
  1716.     REAL*8 DVS(20,75)
  1717.     INTEGER*4 LDVS(2,20,75)
  1718.     EQUIVALENCE(LDVS(1,1,1),DVS(1,1))
  1719.     COMMON /FVLDC/FVLD
  1720. C    CHARACTER*1 DFMTS(10,20,75)
  1721. C 10 CHARACTERS PER ENTRY.
  1722. C    COMMON/DSPCMN/DVS,DFMTS,CWIDS
  1723.     COMMON/DSPCMN/DVS,CWIDS
  1724. C THISRW,THISCL = CURRENT DISPLAYED LOCS.
  1725.     InTeGer*4 LFTMST
  1726.     InTeGer*4 THISRW,THISCL
  1727. C NOTE ROWS ARE DOWN, COLS ACROSS INTERNALLY.
  1728. C COLUMN 2 = NUMBERS. DISPLAY COLS 2-22 WITH COL 1=TITLE
  1729. C COL 23,24 FOR COMMANDS.(23 (PARAMETER) ACTUALLY.)
  1730. C ROW OFFSET BY 6 FOR NUMBERS.
  1731. C
  1732. C MAINTAIN AN "INITIALIZED" BITMAP HERE TO USE TO AVOID GOING TO
  1733. C FVLD.
  1734. C    CHARACTER*1 IBITMP
  1735. C    DIMENSION IBITMP(2258)
  1736. C    COMMON/INITD/IBITMP
  1737. C NOTE BITMAP IS ZEROED IN SPREDSHT MAIN PROGRAM (OR AT SAVE CMD)
  1738. C AND IS SET HERE (AND HERE ONLY). ONLY USED HERE TOO...
  1739.     character*100 fwt
  1740. C    CHARACTER*1 LBITS(8)
  1741. CC    DATA LBITS/1,2,4,8,16,32,64,128/
  1742. C    LBITS(1)=1
  1743. C    LBITS(2)=2
  1744. C    LBITS(3)=4
  1745. C    LBITS(4)=8
  1746. C    LBITS(5)=16
  1747. C    LBITS(6)=32
  1748. C    LBITS(7)=64
  1749. C    LBITS(8)=128
  1750.     IF(ICODE.NE.10)GOTO 3000
  1751.     CALL UVT100(1,LLCMD,1)
  1752.     CALL UVT100(12,2,0)
  1753.     call Vwrt('Enter Print File Spec, / after to omit borders>',47)
  1754.     READ(IOLVL,26,END=8884,ERR=8884)FORM2
  1755. 26    FORMAT(128A1)
  1756. C FIND SIZE OF LINE READ IN
  1757.     DO 750 N=1,128
  1758.     ISZ=129-N
  1759.     IF(FORM2(N).GT.' ')GOTO 751
  1760. 750    CONTINUE
  1761. 751    CONTINUE
  1762.     ISZ=ISZ+1
  1763.     ISZ=MIN0(127,ISZ)
  1764.     FORM2(ISZ+1)=0
  1765.     BORDR=0
  1766.     TOMT=0
  1767.     DO 4111 N=1,ISZ
  1768. C IF FILENAME HAS / AFTERWARDS, OMIT BORDER
  1769.     IF(FORM2(N).EQ.'/')BORDR=1
  1770. C NULL OUT THE / SO THAT FILENAME WILL PARSE CORRECTLY.
  1771.     IF(FORM2(N).EQ.'/')FORM2(N)=0
  1772.     IF(FORM2(N).EQ.'%')TOMT=1
  1773. 4111    CONTINUE
  1774. C    OPEN(8,FILE=FORM2,RECL=132,STATUS='NEW')
  1775.     CALL WASSIGN(8,FORM2)
  1776.     DO 27 N=1,132
  1777. 27    PRTLIN(N)=Char(32)
  1778.     WRITE(PRTLX(1:7),2)
  1779. C    ENCODE(7,2,PRTLIN)
  1780.     GOTO 3666
  1781. 3000    CONTINUE
  1782.     NULAST=-4
  1783. 3666    CONTINUE
  1784.     CALL UVT100(13,0,0)
  1785.     IF(TOMT.EQ.0.AND.ICODE.EQ.10)WRITE(8,17)NMSH
  1786.     IF(ICODE.EQ.10)GOTO 2000
  1787.     IF(ICODE.NE.2)GOTO 1000
  1788. C DRAW LABELS FIRST
  1789.     CALL UVT100(1,1,1)
  1790.     CALL UVT100(12,2,0)
  1791.     IF(ICODE.NE.10)call swrt(nmsh,80)
  1792.     CALL UVT100(1,2,1)
  1793.     CALL UVT100(12,2,0)
  1794. C ERASE TOP LINE, START AT COL 7
  1795.     call swrt('ROW\COL',7)
  1796. 2    FORMAT('ROW\COL')
  1797. C NOTE EXACTLY 7 CHARACTERS IN FORMAT #2
  1798. 2000    CONTINUE
  1799.     J=8
  1800.     CALL UVT100(13,7,0)
  1801.     DO 1 N1=1,DRWV
  1802.     LR=NRDSP(N1,1)
  1803. C NOTE PHYS SHEET OFFSET BY 1 (SEE VARSCN)
  1804. C DISPLAY SHEET NUMBERS START AT 1
  1805.     IF(ICODE.NE.10)CALL UVT100(1,2,J)
  1806.     CALL IN2AS(LR,LBEL)
  1807.     IF(ICODE.EQ.10)GOTO 2020
  1808.     write(fwt(1:100),3)LBEL
  1809.     CALL SWRT(fwt(1:100),4)
  1810. c    WRITE(0,3)LBEL
  1811. 3    FORMAT(4A1)
  1812.     IF(LBEL(4).EQ.' '.AND.LBEL(3).EQ.' ')CALL UVT100(1,2,J+2)
  1813.     IF(LBEL(4).EQ.' '.AND.LBEL(3).NE.' ')CALL UVT100(1,2,J+3)
  1814.     write(fwt(1:100),7)n1
  1815.     call swrt(fwt(1:100),3)
  1816. 7    FORMAT('=',I2)
  1817.     GOTO 2030
  1818. 2020    CONTINUE
  1819.     IF((J+CWIDS(N1)-7).GT.121)GOTO 2030
  1820.     ICWD=MAX0(7,CWIDS(N1))
  1821.     WRITE(CWRK(1:127),2021,ERR=2030)LBEL,N1
  1822.     DO 752 N=1,ICWD
  1823.     PRTLIN(J-1+N)=CCWRK(N)
  1824. 752    CONTINUE
  1825. C    ENCODE(ICWD,2021,PRTLIN(J),ERR=2030),LBEL,N1
  1826. 2021    FORMAT(4A1,'=',I2)
  1827. 2030    CONTINUE
  1828.     J=J+CWIDS(N1)
  1829.     IF(J.GT.132)GOTO 40
  1830. 1    CONTINUE
  1831. 40    CONTINUE
  1832. C NOW COL LBLS DONE
  1833. C DO NUMBERS ACROSS LEFT.
  1834. C ONLY DO SO ON SCREEN.
  1835.     IF(BORDR.EQ.0.AND.ICODE.EQ.10)WRITE(8,18)PRTLIN
  1836.     DO 2031 KKK=1,132
  1837.     FILINE(KKK)=Char(32)
  1838. 2031    PRTLIN(KKK)=Char(32)
  1839.     IF(ICODE.EQ.10)GOTO 1000
  1840.     CALL UVT100(13,7,0)
  1841.     MCX=MIN0(LLCMD-1,DCLV)+2
  1842. C    LLVL=0
  1843. C ROWS ARE JUST OFFSET...NO MONKEY BUSINESS.
  1844.     DO 6 N1=3,MCX
  1845.     M1=N1-2
  1846.     LC=NCDSP(1,M1)-1
  1847. C N1=DISPLAY ROW
  1848.     CALL UVT100(1,N1,1)
  1849.     write(fwt(1:100),8)lc
  1850.     call swrt(fwt(1:100),6)
  1851. 8    FORMAT(I5,'>')
  1852. 6    CONTINUE
  1853. C NOW DISPLAY VALUES.
  1854. 1000    CONTINUE
  1855.     CALL UVT100(13,0,0)
  1856. C main screen display loop here.
  1857.     DO 10 N2=1,DCLV
  1858.     JP=8
  1859.     JPL=125
  1860.     DO 110 N1=1,DRWV
  1861.     M1=NRDSP(N1,N2)
  1862.     M2=NCDSP(N1,N2)
  1863. C M1,M2 = PHYS SHEET COORDS OF WHAT IS DISPLAYED.
  1864.     M2M1=M2-1
  1865.     IF(BORDR.EQ.0.AND.ICODE.EQ.10)WRITE(PRTLX(1:7),8)M2-1
  1866. C *** OMIT DISPLAY IF FVLD=0 ***
  1867. C
  1868.     CALL FVLDGT(M1,M2,FVLD(1,1))
  1869.     IF((ICHAR(FVLD(1,1)).EQ.0).AND.ICODE.NE.2.AND.ICODE.NE.
  1870.      1  10.AND.IDOL4.EQ.0) GOTO 100
  1871. C ******************************
  1872.     VDSP=DVS(N1,N2)
  1873.     CALL XVBLGT(M1,M2,VCLC)
  1874. C    VCLC=XVBLS(M1,M2)
  1875. C SEE IF DISPLAYED AND CALCULATED NUMBERS ARE IDENTICAL.
  1876. C ONLY DISPLAY IF CHANGED.
  1877.     IF(IDOL4.NE.0)GOTO 620
  1878.     IF(VDSP.EQ.VCLC.AND.ICODE.NE.2.AND.ICODE.NE.10)GOTO 100
  1879. 620    IC1POS=M1
  1880.     IC2POS=M2
  1881. C FALL THRU HERE IF WE NEEDTO DISPLAY A NUMBER IN ROW 3+N2, COL N1
  1882. C THEN RE-ESTABLISH FORMAT, ETC.
  1883.     M23=N2+2
  1884.     J=8
  1885.     DO 11 N11=1,N1
  1886. C GET THE COORDS OF OUR CELL.
  1887. 11    J=J+CWIDS(N11)
  1888.     J=J-CWIDS(N1)
  1889. C CURRENT CHARACTER COL NUMBER IS NOW J.
  1890. C    CALL UVT100(1,M23,J)
  1891. C    IRX=(M2-1)*60+M1
  1892.     CALL REFLEC(M2,M1,IRX)
  1893. C
  1894. C GET FORMULA IN NOW
  1895.     CALL WRKFIL(IRX,CWRK(1:127),0)
  1896.     CALL CE2A(CWRK(1:127),FORM)
  1897. C CONVERT ENCODED FORMS TO REGULAR ASCII
  1898. C    READ(7'IRX)FORM
  1899. C ALLOW FOR FVLD TO HAVE CONSTANT VS FORMULA SIGNIFICANCE
  1900.     IF(JCHAR(FORM(119)).LT.-1)FORM(119)=Char(253)
  1901.     IF(JCHAR(FORM(119)).GT.1)FORM(119)=Char(3)
  1902. C
  1903. c try & omit reset here... could mess other places up.
  1904. cC FVLD VALUES OF 2 INDICATE ALREADY-COMPUTED CONSTANTS.DON'T
  1905. cC FORCE THEM TO BE REDONE. OTHERWISE DO FILL IN HOWEVER.
  1906. c    CALL FVLDGT(M1,M2,FVLD(1,1))
  1907. c    IF(ICHAR(FVLD(1,1)).NE.2)CALL FVLDST(M1,M2,FORM(119))
  1908. cC    FVLD(M1,M2)=FORM(119)
  1909. cC    IF(FORM(120).LE.0)CALL FVLDST(M1,M2,char(0))
  1910.     CALL FVLDGT(M1,M2,FVLD(1,1))
  1911.     FVLDTP=FVLD(1,1)
  1912. C HANDLE FILE INCLUSION IN SUBROUTINE...
  1913.     IF (IDOL4.NE.0)CALL DSPFIL(ICODE,FORM,FORM2,FVLDTP,LFTMST,
  1914.      1  LENTL,LOCOL,FILINE,LLVL,LLU,LLVLF,J)
  1915. C NOTE WE CALL DSPFIL SO IT CAN BE OVERLAIN AND LET THE REST
  1916. C OF DSPSHT STAY RESIDENT. (SHOULD SPEED THINGS UP MOST OF
  1917. C THE TIME)...
  1918. C THIS SETTING OF FVLD ALLOWS THE Q OPTION TO WORK.
  1919.     IF(ICHAR(FVLDTP).NE.0)CALL UVT100(1,M23,J)
  1920. 13    CONTINUE
  1921.     CALL XVBLGT(M1,M2,DVS(N1,N2))
  1922. C    DVS(N1,N2)=XVBLS(M1,M2)
  1923.     IF(ICHAR(FVLDTP).EQ.0)GOTO 100
  1924.     IF(FORMFG.LE.0.AND.JCHAR(FVLDTP).GE.0)GOTO 756
  1925.     DO 757 N=1,100
  1926. 757    FORM2(N)=FORM(N)
  1927. 756    CONTINUE
  1928. C     1  ENCODE(100,17,FORM2)(FORM(II),II=1,100)
  1929. 17    FORMAT(1X,80A1)
  1930.     IF(FORMFG.NE.0)GOTO 4321
  1931.     DO 6304 KKKK=1,9
  1932.     KKKKK=ICHAR(FORM(KKKK+119))
  1933. C    KKKKK=DFMTS(KKKK,N1,N2)
  1934. 6304    DFE(KKKK+1)=Char(MAX0(32,KKKKK))
  1935.     DFE(11)=Char(32)
  1936.     DFE(1)='('
  1937.     DFE(12)=' '
  1938. c omit any \ formats from dfe since encode fouls up with them.
  1939.     DFE(13)=' '
  1940.     DFE(14)=')'
  1941.     CALL TYPGET(M1,M2,TYPE(1,1))
  1942. c    IF(TYPE(1,1).EQ.2.AND.JCHAR(FVLDTP).GT.0)
  1943. c     1  WRITE(CWRK(1:127),CDFE(1:14),ERR=4321)DVS(N1,N2)
  1944. c    IF(TYPE(1,1).NE.2.AND.JCHAR(FVLDTP).GT.0)
  1945. c     1  WRITE(CWRK(1:127),CDFE(1:14),ERR=4321)LDVS(1,N1,N2)
  1946. d    kkkk=loc(DFE(1))
  1947. d    kkkkk=loc(cdfe)
  1948. d    write(*,8210)kkkkk,kkkkk
  1949. d8210    format(' DFE, CDFE locs=',2I12)
  1950.     IF(TYPE(1,1).EQ.2.AND.JCHAR(FVLDTP).GT.0)
  1951.      1  WRITE(CWRK(1:127),DFE,ERR=4321)DVS(N1,N2)
  1952.     IF(TYPE(1,1).NE.2.AND.JCHAR(FVLDTP).GT.0)
  1953.      1  WRITE(CWRK(1:127),DFE,ERR=4321)LDVS(1,N1,N2)
  1954.     IF(JCHAR(FVLDTP).LE.0)GOTO 4321
  1955.     DO 758 N=1,100
  1956. 758    FORM2(N)=CCWRK(N)
  1957. 4321    CONTINUE
  1958.     KWID=CWIDS(N1)
  1959. C  *** FIND OUT HOW MUCH ROOM THERE IS NOW. WE KNOW WHERE WE'RE DISPLAYING, SO
  1960. C  *** ALLOW NULL CELLS TO BE SHOWN PROVIDED WE ARE:
  1961. C  1. DISPLAYING TEXT IN THE CELL, OR
  1962. C  2. IN VIEW FORMULA MODE, AND THE NEXT CELL(S) OVER ARE NULL (FVLD=0)
  1963.     IF(FORMFG.EQ.0.AND.JCHAR(FVLDTP).GE.0)GOTO 8444
  1964.     III=N1+1
  1965.     IF(III.GT.DRWV)GOTO 8446
  1966.     DO 8445 II=III,DRWV
  1967. C FOLLOW ALONG WITH THE DISPLAY'S MAPPING TO SHEET.
  1968.     IIII=NRDSP(II,N2)
  1969.     IIIII=NCDSP(II,N2)
  1970.     CALL FVLDGT(IIII,IIIII,FVLD(1,1))
  1971.     IF(ICHAR(FVLD(1,1)).NE.0)GOTO 8444
  1972.     KWID=KWID+CWIDS(II)
  1973. 8445    CONTINUE
  1974. 8446    CONTINUE
  1975. C TEST IF LAST CELL IS NULL
  1976. 8444    CONTINUE
  1977.     KWID=MIN0(KWID,JPL)
  1978. C ****** END OF MODS FOR PRINTING INTO ADJACENT NULL CELLS.
  1979.     IF(ICODE.NE.10)CALL SWRT(FORM2,KWID)
  1980.     IF(ICODE.NE.10)GOTO 100
  1981.     IF(JPL-KWID.LT.0)GOTO 115
  1982.     DO 759 II=1,KWID
  1983.     IIII=JP+II-1
  1984. 759    PRTLIN(IIII)=FORM2(II)
  1985. C    ENCODE(KWID,17,PRTLIN(JP),ERR=100)(FORM2(II),II=1,KWID)
  1986. 100    CONTINUE
  1987. 115    CONTINUE
  1988. C HERE KEEP TRACK OF AMOUNT PRINTED.
  1989.     JP=JP+CWIDS(N1)
  1990.     JPL=JPL-CWIDS(N1)
  1991. 110    CONTINUE
  1992.     IF(ICODE.NE.10)GOTO 10
  1993.     DO 634 KKKQ=1,132
  1994.     IF(ICHAR(PRTLIN(KKKQ)).LT.32)PRTLIN(KKKQ)=Char(32)
  1995. 634    CONTINUE
  1996.     WRITE(8,18)(PRTLIN(II),II=1,JP)
  1997. 18    FORMAT(1X,100A1,34A1)
  1998.     DO 19 LN1=1,132
  1999. 19    PRTLIN(LN1)=Char(32)
  2000. 10    CONTINUE
  2001.     IF(ICODE.EQ.10)CLOSE(8)
  2002.     IF(IDOL4.EQ.0)RETURN
  2003.     DO 9915 N=1,4
  2004.     LLU=N+10
  2005.     CLOSE(LLU)
  2006. 9915    CONTINUE
  2007.     LLVL=0
  2008. 8884    RETURN
  2009.     IOLVL=11
  2010.     CLOSE(3)
  2011.     CLOSE(11)
  2012.     OPEN(UNIT=11,FILE='CON:0/0/100/100/Analy Command')
  2013.     RETURN
  2014.     END
  2015. c -h- errcx.for    Fri Aug 22 13:08:07 1986    
  2016.     SUBROUTINE ERRCX (RETCD)
  2017. C COPYRIGHT (C) 1983 GLENN EVERHART
  2018. C ALL RIGHTS RESERVED
  2019. C 60=MAX REAL ROWS
  2020. C 301=MAX REAL COLS
  2021. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  2022. C VBLS AND TYPE DIMENSIONED 60,301
  2023. C **************************************************
  2024. C *                                                *
  2025. C *            SUBROUTINE ERRCX                    *
  2026. C *                                                *
  2027. C **************************************************
  2028. C
  2029. C
  2030. C THIS SUBROUTINE DOES INITIAL SYNTAX CHECKING ON THE INPUT
  2031. C LINE. THE CHECKS MAKE SURE THAT PARENTHESES ARE BALANCED
  2032. C AND THAT THE EQUAL SIGN IS NOT MISUSED.
  2033. C
  2034. C RETCD     MEANING
  2035. C
  2036. C   1        NO ERRORS DETECTED
  2037. C   2        ERROR FOUND
  2038. C
  2039. C
  2040. C
  2041. C
  2042. C   MODIFICATION CLASSES: M1
  2043. C
  2044. C
  2045. C
  2046. C
  2047. C ERRCX CALLS ERRMSG WHICH PRINTS ERROR MESSAGES.
  2048. C
  2049. C
  2050. C
  2051. C ERRCX IS CALLED BY CALC
  2052. C
  2053. C
  2054. C
  2055. C   VARIABLE       USE
  2056. C
  2057. C    ALPHA(27)    HOLDS LEGAL VARIABLE NAMES: ALPHABETIC
  2058. C                 OR THE CHARACTER %.
  2059. C    BLANK        ' '
  2060. C    I,J          HOLDS TEMPORARY VALUES.
  2061. C    LAST         HOLDS A CODE WHEN LOOKING FOR ERRORS INVOLVING
  2062. C                 THE EQUAL SIGN.
  2063. C    LEND         LAST NON-BLANK CHARACTER IN LINE(80).
  2064. C    LPAR         '('
  2065.  
  2066. C    PARCNT       0 IF PARENTHESIS ENCOUNTERED BALANCE. INCREASED
  2067. C                 BY 1 FOR EVERY LEFT PARENTHESIS, DECREASED BY
  2068. C                 BY 1 FOR EVERY RIGHT PERENTHESIS FOUND.
  2069. C    RETCD        HOLDS RETURN CODE. 1=O.K.  2=ERROR
  2070. C    RPAR         ')'
  2071. C
  2072. C
  2073. C
  2074. C    MODIFIED    REASON
  2075. C
  2076. C    18-MAY-1981    WHEN CHECKING FOR BALANCED PARENTHESIS, DON'T
  2077. C            INCLUDE THOSE THAT ARE PRECEEDED BY A SINGLE QUOTE
  2078. C            (CODE AT DO 100) (PB)
  2079. C
  2080. C
  2081. C
  2082. C    SUBROUTINE ERRCX (RETCD)
  2083.     InTeGer*4 LEVEL,NONBLK,LEND
  2084.     InTeGer*4 RETCD,PARCNT,VIEWSW,BASED
  2085.     InTeGer*4 I,J,LAST
  2086. C
  2087.     CHARACTER*1 ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  2088.     CHARACTER*1 LINE(80)
  2089.     CHARACTER*1 QUOTE
  2090.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  2091.     COMMON /CONS/ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  2092.     DATA QUOTE/''''/
  2093. C
  2094. C
  2095. C
  2096.     RETCD=1
  2097. C
  2098. C **************************************************
  2099. C ******  MAKE SURE PARENTHESIS ARE BALANCED  ******
  2100. C **************************************************
  2101. C
  2102.     PARCNT=0
  2103.     I=NONBLK
  2104. 4100    CONTINUE
  2105. C    DO 100 I=NONBLK,LEND
  2106. C SKIP VARIABLE NAMES WHICH ARE IN ENCODED FORM
  2107.     IF(ICHAR(LINE(I)).NE.255)GOTO 4101
  2108.     I=I+2
  2109.     GOTO 100
  2110. C AT 100 ADD 1 MORE TO I, SKIPPING CRUFT.
  2111. 4101    CONTINUE
  2112.     IF (LINE(I).EQ.LPAR) GOTO 50
  2113.     IF (LINE(I).EQ.RPAR) GOTO 80
  2114.     GOTO 100
  2115. C
  2116. C ENCOUNTERED A LEFT PARENTHESIS, COUNT IT ONLY IF PRECEEDING
  2117. C CHARACTER IS NOT A SINGLE QUOTE
  2118. 50    IF(I.EQ.NONBLK) GOTO 60
  2119.     IF(LINE(I-1).EQ.QUOTE) GOTO 100
  2120. 60    PARCNT=PARCNT+1
  2121.     GOTO 100
  2122. C
  2123. C ENCOUNTERED A RIGHT PARENTHESIS, COUNT IT ONLY IF PRECEEDING
  2124. C CHARACTER IS NOT A SINGLE QUOTE
  2125. 80    IF(I.EQ.NONBLK) GOTO 90
  2126.     IF(LINE(I-1).EQ.QUOTE) GOTO 100
  2127. 90    PARCNT=PARCNT-1
  2128.     IF(PARCNT.LT.0)GOTO 160
  2129. 100    CONTINUE
  2130.     I=I+1
  2131.     IF(I.LE.LEND)GOTO 4100
  2132. C
  2133.     IF (PARCNT.EQ.0) GOTO 200
  2134. C
  2135. C
  2136. C UNBALANCED PARENTHESIS
  2137.     I=6
  2138. 140    CALL ERRMSG(I)
  2139. 150    RETCD=2
  2140.     RETURN
  2141. C
  2142. C
  2143. C ILLEGAL EXPRESSION LIKE ')))X((('
  2144. 160    I=8
  2145.     GOTO 140
  2146. C
  2147. C
  2148. C **************************************************
  2149. C *********   = SIGN SYNTAX CHECK   ****************
  2150. C **************************************************
  2151. C
  2152. 200    CONTINUE
  2153. C
  2154. C
  2155. C  ALLOW A=B=C+2
  2156. C  MAY ONLY ASSIGN VALUES TO SINGLE UNSIGNED VARIABLES.
  2157. C  ALSO CATCH  =A
  2158. C       AND    A==B
  2159. C
  2160. C  LAST    =  0    FIRST CHAR OR FOUND =
  2161. C       1    1 ALPHA CHARACTER
  2162. C       2    MORE THAN 1 ALPHA OR
  2163. C        ENCOUNTERED NON-ALPHA
  2164. C        (BUT NOT = OR BLANK)
  2165. C
  2166. C
  2167.     LAST=0
  2168.     I=NONBLK
  2169. 271    CONTINUE
  2170. C    DO 270 I=NONBLK,LEND
  2171.     IF (LINE(I).EQ.BLANK) GOTO 270
  2172.     IF (LINE(I).EQ.EQ) GOTO 230
  2173. C
  2174. C
  2175. C  LOOK FOR ALPHA
  2176. C    DO 220 J=1,27
  2177. C    IF (LINE(I).EQ.ALPHA(J)) GOTO 240
  2178. C220    CONTINUE
  2179. C LOOK FOR ANY VARIABLE NAME (NOT JUST ALPHA) (GCE)
  2180.     LLND=LEND
  2181.     CALL VARSCN(LINE,I,LLND,LSTCHR,ID1,ID2,IVALID)
  2182.     IF(IVALID.EQ.0) GOTO 220
  2183.     I=LSTCHR
  2184.     IF(LSTCHR.LT.LEND)I=LSTCHR-1
  2185. C IF WE GET A GOOD VARIABLE NAME POINT AT ITS END AND GO SAY WE'RE OK.
  2186.     GOTO 240
  2187. 220    CONTINUE
  2188. C
  2189. C
  2190. C   MORE THAN 1 ALPHA OR ENCOUNTERED NON-ALPHA
  2191. C (BUT NOT = SIGN OR BLANK)
  2192. 225    LAST=2
  2193.     GOTO 270
  2194. C
  2195. C
  2196. C = SIGN ENCOUNTERED
  2197. 230    IF (LAST.EQ.1) GOTO 235
  2198. C
  2199. C ILLEGAL USE OF = SIGN
  2200.     GOTO 290
  2201. C
  2202. C HAD 1 ALPHA CHARACTER FOLLOWED BY = SIGN
  2203. 235    LAST=0
  2204.     GOTO 270
  2205. C
  2206. C ENCOUNTERED A VARIABLE NAME (1 CHARACTER)
  2207. 240    IF (LAST.EQ.2) GOTO 270
  2208.     IF (LAST.EQ.1) GOTO 225
  2209. C
  2210. C
  2211. C EXACTLY 1 ALPHA CHARACTER EITHER AS FIRST CHARACTER
  2212. C ENCOUNTERED OR AS THE 1ST CHARACTER AFTER AN = SIGN.
  2213.     LAST=1
  2214. 270    CONTINUE
  2215.     I=I+1
  2216.     IF(I.LE.LEND) GOTO 271
  2217. C *****&&&&&  SIMULATE DO LOOP TO ALLOW MONKEYING WITH INDEX INSIDE.
  2218. C WHICH IS DONE SO WE CAN HUNT FOR VARIABLES BY NAME...
  2219. C
  2220. C
  2221. C <<<<<<<<<<<< ADD ADDITIONAL CHECKS HERE >>>>>>>>>>
  2222. C
  2223.     RETURN
  2224. C
  2225. C
  2226. C ILLEGAL USE OF = SIGN
  2227. 290    I=17
  2228.     GO TO 140
  2229.     END
  2230. c -h- errmsg.for    Fri Aug 22 13:08:07 1986    
  2231.     SUBROUTINE ERRMSG (IMSG)
  2232. C COPYRIGHT (C) 1983 GLENN EVERHART
  2233. C ALL RIGHTS RESERVED
  2234. C 60=MAX REAL ROWS
  2235. C 301=MAX REAL COLS
  2236. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  2237. C VBLS AND TYPE DIMENSIONED 60,301
  2238. C **************************************************
  2239. C *                                                *
  2240. C *       SUBROUTINE  ERRMSG(MSG)                  *
  2241. C *                                                *
  2242. C **************************************************
  2243. C
  2244. C
  2245. C PRINTS OUT ERROR MESSAGES AS REQUESTED BY CODE IN MSG.
  2246. C
  2247. C ERRMSG IS CALLED BY THE FOLLOWING ROUTINES:
  2248. C
  2249. C AT
  2250. C BASCNG
  2251. C CALBIN
  2252. C CALC
  2253. C CALUN
  2254. C CMND
  2255. C CONTYP
  2256. C DECLR
  2257. C ERRCX
  2258. C INPOST
  2259. C MULADD
  2260. C MULDIV
  2261. C MULMUL
  2262. C NEXTEL
  2263. C POSTVL
  2264. C VAROUT
  2265. C ZNEG
  2266. C
  2267. C
  2268. C    VARIABLE    USE
  2269. C
  2270. C   I         TEMPORARY VARIABLE TO AVOID SIDE-EFFECT WITH CALLS
  2271. C             THAT USE A CONSTANT FOR THE ARGUMENT.
  2272. C   MSG       ERROR MESSAGE CODE.
  2273. C
  2274. C
  2275. C
  2276. C  NOTE: USE CODE 25 FOR UNKNOWN CAUSES.
  2277. C
  2278. C
  2279. C
  2280. C    SUBROUTINE ERRMSG (MSG)
  2281. C
  2282.     InTeGer*4 IMSG,I
  2283.     CHARACTER*20 MSG(27)
  2284.     CHARACTER*8 EMSG
  2285.     DATA EMSG/'*ERROR* '/
  2286.     DATA MSG(1)/'1ST CHAR ILLEGAL   '/
  2287.     DATA MSG(2)/'INDIR.NEST OVFLOW  '/
  2288.     DATA MSG(3)/'UNIDENTIFIED CMND  '/
  2289.     DATA MSG(4)/'ILL CHR IN VBL LIST'/
  2290.     DATA MSG(5)/'VBLS NT SEP W/COMMA'/
  2291.     DATA MSG(6)/'UNBAL PARENTHESIS  '/
  2292.     DATA MSG(7)/'STACK 1 OVERFLOW   '/
  2293.     DATA MSG(8)/'ILLEGAL EXPRESSION '/
  2294.     DATA MSG(9)/'STACK 2 OVERFLOW   '/
  2295.     DATA MSG(10)/'FCN ILL W/INT ARGS '/
  2296.     DATA MSG(11)/'FCN ILL W/MPR ARGS '/
  2297.     DATA MSG(12)/'FCN ILL W/ASCI ARG '/
  2298.     DATA MSG(13)/'FCN ILL W/REAL ARG '/
  2299.     DATA MSG(14)/'SQRT OF NEG NUMBER '/
  2300.     DATA MSG(15)/'MP EXP W/NEG POWER '/
  2301.     DATA MSG(16)/'UNDEFINED VARIABLE '/
  2302.     DATA MSG(17)/'ILL USE OF = SIGN  '/
  2303.     DATA MSG(18)/'UNIDENTIFIED FUNCT '/
  2304.     DATA MSG(19)/'ILLEGAL BASE SPEC  '/
  2305.     DATA MSG(20)/'ILLEGAL CHARACTER  '/
  2306.     DATA MSG(21)/'. OK ONLY W/BASE 10'/
  2307.     DATA MSG(22)/'OVER 19 DIGIT MP NO'/
  2308.     DATA MSG(23)/'DIVIDE BY ZERO ERR '/
  2309.     DATA MSG(24)/'ILL REAL EXP FIELD '/
  2310.     DATA MSG(25)/'WEIRD BUG. CALL GE.'/
  2311.     DATA MSG(26)/'ILLEG CONVERSION   '/
  2312.     DATA MSG(27)/'READ ERROR         '/
  2313. C
  2314. C
  2315.     CALL UVT100(1,1,10)
  2316. C WRITE "*ERROR*" FOLLOWED BY MESSAGE TEXT/
  2317.     CALL SWRT(EMSG,8)
  2318.     I=IMSG
  2319.     IF(I.LE.0.OR.I.GT.27)I=25
  2320.     CALL SWRT(MSG(I),20)
  2321. C
  2322. 99    RETURN
  2323.     END
  2324. c -h- flip.for    Fri Aug 22 13:09:05 1986    
  2325.     SUBROUTINE FLIP (VEC,SIZE,PT)
  2326. C COPYRIGHT (C) 1983 GLENN EVERHART
  2327. C ALL RIGHTS RESERVED
  2328. C 60=MAX REAL ROWS
  2329. C 301=MAX REAL COLS
  2330. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  2331. C VBLS AND TYPE DIMENSIONED 60,301
  2332. C **************************************************
  2333. C *                                                *
  2334. C *         SUBROUTINE FLIP(VEC,SIZE,PT)           *
  2335. C *                                                *
  2336. C **************************************************
  2337. C
  2338. C
  2339. C  FLIPS THE NON-ZERO DIGITS UP TO PT IN VECTOR VEC IN REVERSE
  2340. C  ORDER.  USED TO PLACE NUMBERS IN PROPER ORDER INTO VBLS THAT
  2341. C  HAVE BEEN READ IN HIGH ORDER FIRST.
  2342. C
  2343. C FLIP IS CALLED BY NEXTEL
  2344. C
  2345. C   VARIABLE   USE
  2346. C
  2347. C     H1     TEMPORARILY HOLDS A CHARACTER*1 VALUE
  2348. C     I      INDEXES DIGITS THAT ARE FLIPPED.
  2349. C     K      THE MIDPOINT OF THE FLIPPING ACTION.
  2350. C     PT     HOLDS THE RANGE OF THE FLIPPING ACTION.
  2351. C            (USUALLY THE HIGH ORDER NON-ZERO DIGIT)
  2352. C
  2353. C
  2354. C
  2355. C    SUBROUTINE FLIP (VEC,SIZE,PT)
  2356. C
  2357. C
  2358.     InTeGer*4 SIZE,PT
  2359.     InTeGer*4 K
  2360. C
  2361.     CHARACTER*1 VEC(SIZE), H1
  2362. C
  2363. C
  2364.     K=PT/2
  2365.     IF (K.EQ.0) GOTO 20
  2366.     DO 10 I=1,K
  2367.     H1=VEC(I)
  2368.     VEC(I)=VEC(PT+1-I)
  2369. 10    VEC(PT+1-I)=H1
  2370. 20    RETURN
  2371.     END
  2372. c -h- fname.fms    Fri Aug 22 13:09:16 1986    
  2373.     SUBROUTINE FNAME(LINE,LLAST,INDEXF)
  2374. C RETURN FUNCTION NAME IF ANY
  2375. C IMPLEMENT CODE RECOGNITION ALSO...
  2376. C CODES 230-254 ARE THE FUNCTION NAMES... REPLACE THE 3 BYTES BY 1
  2377. C CODE BYTE TO IMPLEMENT...
  2378. C
  2379.     CHARACTER*1 LINE(110)
  2380. c    EXTERNAL INDX
  2381.     INTEGER*4 FNAM(26)
  2382.     character*4 fnmx(26)
  2383.     equivalence(fnmx(1)(1:1),fnam(1))
  2384.     CHARACTER*1 FCHNM(4,26)
  2385.     EQUIVALENCE(FNAM(1),FCHNM(1,1))
  2386.     DATA FNMX/'MIN ','MAX ','AVG ','SUM ','STD ','IF  ',
  2387.      1  'AND ','IOR ','NOT ','CNT ','NPV ','LKP ',
  2388.      2  'LKN ','LKE ','XOR ','EQV ','MOD ','REM ','SGN ','IRR ',
  2389.      3  'RND ','PMT','PVL','AVE','CHS','ATM'/
  2390.     INDEXF=0
  2391.     N1=ICHAR(LINE(1))
  2392. C RECOGNIZE ENCODED VARIABLE NAMES.
  2393.     IF(N1.LT.230.OR.N1.GT.254)GOTO 3000
  2394.     INDEXF=N1-229
  2395.     RETURN
  2396. 3000    CONTINUE
  2397.     DO 1 N1=1,26
  2398.     DO 2 N2=1,3
  2399.     IF(LINE(N2).NE.FCHNM(N2,N1))GOTO 1
  2400. 2    CONTINUE
  2401. C IF WE FALL THROUGH, WE HAVE A VALID FCN NAME INDEX IN INDEXF
  2402.     INDEXF=N1
  2403.     GOTO 3
  2404. 1    CONTINUE
  2405. 3    CONTINUE
  2406.     RETURN
  2407.     END
  2408. c -h- frmedt.ftn    Fri Aug 22 13:09:29 1986    
  2409.     SUBROUTINE FRMEDT(INLIN,LEND)
  2410. C COPYRIGHT 1984 GLENN AND MARY EVERHART
  2411. C ALL RIGHTS RESERVED
  2412. C FORMULA EDIT TO FIND AND EDIT FORMULAS OF FORM
  2413. C    {VAR
  2414. C AND REPLACE THE VARIABLE SPEC BY FORMULA FOR THAT VARIABLE
  2415.     CHARACTER*1 INLIN(110),WRK1(120),WRK2(128)
  2416.     CHARACTER*3 WRK13
  2417.     EQUIVALENCE(WRK13(1:1),WRK1(23))
  2418.     InTeGer*4 RRWACT,RCLACT
  2419. C    COMMON/RCLACT/RRWACT,RCLACT
  2420.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  2421.      1  IDOL7,IDOL8
  2422. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  2423. C     1  IDOL7,IDOL8
  2424.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  2425. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2426.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2427. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  2428. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  2429. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  2430.     InTeGer*4 KLVL
  2431. C    COMMON/KLVL/KLVL
  2432.     InTeGer*4 IOLVL,IGOLD
  2433. C    COMMON/IOLVL/IOLVL
  2434. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  2435. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  2436.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  2437.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  2438.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  2439. CCC    InTeGer*4 LLCMD,LLDSP
  2440. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  2441. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  2442. C ADD LOGICAL NAMES IN THE FOLLOWING FASHION, TO BE MANIPULATED
  2443. C HERE ALONE:
  2444. C
  2445. C STORE LOGICAL NAMES, UP TO 16 CHARS, HERE IN AN ARRAY WITH
  2446. C DESIRED ID1,ID2 VALUES OF CELLS TO LOAD. WHERE A {NAME IS SEEN,
  2447. C REPLACE WITH DESIRED CELL ADDRESS.
  2448. C  TO DEFINE LOGICAL NAMES, LOOK FOR = AFTER A NAME. IF = IS SEEN
  2449. C  AFTER THE { CHARACTER, ASSUME IT'S A LINE OF FORM {SALES=AA0
  2450. C  (OR {SALES=00 TO DEASSIGN) AND STORE THE NAME. UP TO THE USER
  2451. C  TO PUT THE DESIRED FORMULA IN AS HE LIKES. MAY USE A TEST STMT
  2452. C  IF DESIRED.
  2453. CCC    CHARACTER*1 NAMARY(20,301)
  2454. C ALLOW AS MANY NAMES AS THERE ARE ROWS... ARBITRARY...
  2455.     InTeGer*4 ICREF,IRREF
  2456. C    COMMON/MIRROR/ICREF,IRREF
  2457.     InTeGer*4 MODPUB,LIMODE
  2458. C    COMMON/MODPUB/MODPUB,LIMODE
  2459.     InTeGer*4 KLKC,KLKR
  2460.     REAL*8 AACP,AACQ
  2461. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  2462.     InTeGer*4 NCEL,NXINI
  2463. C    COMMON/NCEL/NCEL,NXINI
  2464.     CHARACTER*1 NAMARY(20,301)
  2465. C    COMMON/NMNMNM/NAMARY
  2466.     InTeGer*4 NULAST,LFVD
  2467. C    COMMON/NULXXX/NULAST,LFVD
  2468.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  2469.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  2470.     InTeGer*2 NAMNUM(10,301)
  2471.     EQUIVALENCE(NAMARY(1,1),NAMNUM(1,1))
  2472. CCC    COMMON/NMNMNM/NAMARY
  2473. C NAMNUM(9,RCL) AND NAMNUM(10,RCL) ARE RRW AND RCL
  2474. C STORAGE. NAMARY(1-18,RCL) STORES NAME ASCII TEXT (POSSIBLY
  2475. C NULL TERMINATED). FIND CELLS VIA LINEAR SEARCH.
  2476.     SAVE NAMMAX
  2477.     InTeGer*4 NAMMAX
  2478. C NAMMAX IS MAX DIM OF NAMARY THAT'S FILLED IN.
  2479.     EXTERNAL INDX
  2480.     InTeGer*4 LEND
  2481.     DATA NAMMAX/0/
  2482.     LCNT=0
  2483. 1000    IF(LCNT.GT.20)RETURN
  2484.     KKK=ICHAR('{')
  2485.     I1=INDX(INLIN,KKK)
  2486.     IF(I1.LE.0.OR.I1.GT.70)RETURN
  2487. C ONLY ALLOW IF THERE IS A { CHAR THERE
  2488.     IF(INLIN(I1).NE.'{')RETURN
  2489.     KKK=ICHAR('=')
  2490.     I2=INDX(INLIN,KKK)
  2491.     IF(I2.LE.0.OR.I2.LT.I1.OR.I2.GT.70.OR.INLIN(I2)
  2492.      1  .NE.'=')GOTO 5400
  2493.     IF((I2-I1).LE.1)GOTO 5400
  2494. C HERE SEE AN = SIGN AFTER A {VAR STRING. ATTEMPT TO EVALUATE.
  2495. C GUARANTEED AT LEAST 1 CHARACTER OF NAME.
  2496.     I3=MIN0((I2-I1-1),16)
  2497. c check if * seen ( text would then be  {*= ) for printout
  2498.  
  2499. c of symbol table
  2500.     IF(INLIN(I1+1).NE.'*')GOTO 5600
  2501.     IF(NAMMAX.LE.0)GOTO 5600
  2502.     CALL UVT100(1,LLCMD,1)
  2503.     CALL UVT100(12,2,0)
  2504. C ERASE LINE
  2505.     CALL VWRT('Output File:',12)
  2506.     read(11,5602,end=5419,err=5419)(wrk1(II),II=1,80)
  2507. 5602    format(80a1)
  2508.     DO 5603 N=1,79
  2509.     NN=80-N
  2510.     IF(JCHAR(WRK1(NN)).GT.32)GOTO 5604
  2511.     WRK1(NN)=Char(0)
  2512. 5603    CONTINUE
  2513. 5604    CONTINUE
  2514.     close(8)
  2515.     CALL WASSIG(8,WRK1)
  2516. C OPEN OUTPUT FOR WRITE
  2517. C THEN DUMP SYMBOLS THERE
  2518. C SYMBOL TABLE DUMP CAN BE SAVED ANYWHERE AND REENTERED AS
  2519. C ASSIGNMENT STMTS.
  2520.     WRK1(1)='{'
  2521.     DO 5607 N=2,110
  2522. 5607    WRK1(N)=0
  2523.     WRK1(18)='='
  2524.     DO 5605 N=1,NAMMAX
  2525.     IF(NAMNUM(9,N)+NAMNUM(10,N).LE.0)GOTO 5605
  2526.     DO 5608 NN=1,16
  2527. 5608    WRK1(NN+1)=NAMARY(NN,N)
  2528.     CALL IN2AS(KK,WRK1(19))
  2529.     NAMNUM(9,N)=KK
  2530.     WRITE(WRK13(1:3),5606,ERR=5419)NAMNUM(10,N)-1
  2531. C    ENCODE(3,5606,WRK1(23))NAMNUM(10,N)-1
  2532. 5606    FORMAT(I3)
  2533.     K=3
  2534.     WRK2(1)='T'
  2535.     WRK2(2)='E'
  2536.     WRK2(3)=' '
  2537.     DO 5609 KK=1,106
  2538.     I4=JCHAR(WRK1(KK))
  2539.     IF(I4.LE.32)GOTO 5609
  2540.     K=K+1
  2541.     WRK2(K)=CHAR(I4)
  2542. 5609    CONTINUE
  2543. C WRITE OUT DEFINITIONS AS IF THEY WERE ASSIGMNENT STMTS.
  2544.     WRITE(8,5610)(WRK2(KK),KK=1,K)
  2545. 5610    FORMAT(110A1)
  2546. 5605    CONTINUE
  2547.     CLOSE(8)
  2548.     GOTO 5419
  2549. 5600    CONTINUE
  2550.     LO=I2+1
  2551.     IHI=LO+25
  2552.     CALL VARSCN(INLIN,LO,IHI,LSTCHR,ID1,ID2,IVLD)
  2553. C IF IVLD=0 ASSUME WE'RE UNDEFINING THE SYMBOL
  2554.     IF(IVLD.GT.0)GOTO 5402
  2555. C INVALID SYMBOL. UNDEFINE THE STRING.
  2556.     DO 5403 I4=1,NAMMAX
  2557.     DO 5404 I5=1,I3
  2558. C REQUIRE WHOLE STRING FOR SEARCH.
  2559.     IF(INLIN(I1+I5).NE.NAMARY(I5,I4))GOTO 5403
  2560. 5404    CONTINUE
  2561. C GOT IT IF WE FALL THRU
  2562.     NAMNUM(9,I4)=0
  2563.     NAMNUM(10,I4)=0
  2564. C ZERO THE ELEMENT DEFINITION AND FORGET IT...
  2565.     DO 5432 I5=1,16
  2566. 5432    NAMARY(I5,I4)=Char(0)
  2567. 5403    CONTINUE
  2568.     GOTO 5419
  2569. 5402    CONTINUE
  2570. C VALID ARRAY ELEMENT, DEFINE IT.
  2571.     IF(NAMMAX.LE.0)GOTO 5406
  2572.     DO 5405 I4=1,NAMMAX
  2573.     IF(NAMNUM(9,I4)+NAMNUM(10,I4).EQ.0)GOTO 5410
  2574. 5405    CONTINUE
  2575.     GOTO 5406
  2576. 5410    CONTINUE
  2577. C GOT IT IF WE FALL THRU
  2578.     NAMNUM(9,I4)=ID1
  2579.     NAMNUM(10,I4)=ID2
  2580. C ZERO THE ELEMENT DEFINITION AND FORGET IT...
  2581.     GOTO 5407
  2582. 5406    CONTINUE
  2583.     IF(NAMMAX.LT.0)NAMMAX=0
  2584.     NAMMAX=MIN0(NAMMAX+1,301)
  2585.     NAMNUM(9,NAMMAX)=ID1
  2586.     NAMNUM(10,NAMMAX)=ID2
  2587. C NOW SAVE THE SYMBOL NAME
  2588.     I4=NAMMAX
  2589. 5407    CONTINUE
  2590.     DO 5409 I5=1,16
  2591. 5409    NAMARY(I5,I4)=0
  2592.     DO 5408 I5=1,I3
  2593.     NAMARY(I5,I4)=INLIN(I1+I5)
  2594. 5408    CONTINUE
  2595. C NO FURTHER PROCESSING IF WE DID ANY DEFINITION... JUST EXIT
  2596. 5419    CONTINUE
  2597.     INLIN(1)='%'
  2598. C IF A DEFINITION, JUST PUT SOMETHING INNOCUOUS INTO LINE FOR
  2599. C LATER PROCESSING.
  2600.     DO 5421 I5=2,110
  2601. 5421    INLIN(I5)=0
  2602.     RETURN
  2603. 5400    CONTINUE
  2604. C NOW THAT DEFINITIONS ARE TAKEN CARE OF (IF ANY)
  2605. C HANDLE SYMBOLIC SEARCHES
  2606.     if(nammax.le.0)goto 5505
  2607.     LSTCHR=I1+1
  2608.     DO 5501 I4=1,NAMMAX
  2609.     DO 5502 I5=1,16
  2610.     IF(JCHAR(NAMARY(I5,I4)).LE.47)GOTO 5502
  2611.     IF(JCHAR(INLIN(I1+I5)).LE.47)GOTO 5502
  2612.     LSTCHR=I1+I5+1
  2613.     IF(INLIN(I1+I5).NE.NAMARY(I5,I4))GOTO 5501
  2614. CC SKIP OUT IF WE HAVE A TERMINATING CHARACTER IN DEF
  2615. CC AND HAD AT LEAST 1 NONTERMINATING CHAR IN DEFINITION.
  2616. C    IF(JCHAR(NAMARY(1,I4)).GT.47.AND.
  2617. C     1     JCHAR(NAMARY(I5,I4)).LE.47) GOTO 5560
  2618. 5502    CONTINUE
  2619. 5560    CONTINUE
  2620. C IF WE FALL THRU WE HAVE A MATCH
  2621.     ID1=NAMNUM(9,I4)
  2622.     ID2=NAMNUM(10,I4)
  2623. C LAST CHECK: BE SURE WE AREN'T GIVING A DELETED SYMBOL.
  2624.     IF((ID1+ID2).GT.0)GOTO 5500
  2625. 5501    CONTINUE
  2626. 5505    continue
  2627.     LO=I1+1
  2628.     IHI=LO+25
  2629.     CALL VARSCN(INLIN,LO,IHI,LSTCHR,ID1,ID2,IVLD)
  2630.     IF(IVLD.LE.0)RETURN
  2631. 5500    CONTINUE
  2632.     DO 11 N1=1,120
  2633. 11    WRK1(N1)=0
  2634. C HERE HAVE A VALID CONSTRUCT SO REPLACE IT
  2635. C (ONLY ONE PER LINE THIS TIME ROUND)
  2636. C    IRX=(ID2-1)*60+ID1
  2637.     CALL REFLEC(ID2,ID1,IRX)
  2638. C COPY FIRST PART OF FORMULA TO WORK ARRAY
  2639.     LO=I1-1
  2640.     IHI=0
  2641.     IF(LO.LE.0)GOTO 10
  2642.     DO 1 N1=1,LO
  2643.     IHI=N1
  2644.     WRK1(IHI)=INLIN(N1)
  2645. 1    CONTINUE
  2646. 10    CONTINUE
  2647.     IHI=IHI+1
  2648.     CALL WRKFIL(IRX,WRK2,0)
  2649. C WRKFIL READS THE FORMULA INTO WRK2. NEXT FIND END OF TEXT
  2650.     DO 2 N1=1,110
  2651.     LO=111-N1
  2652.     IF(ICHAR(WRK2(LO)).GT.32)GOTO 3
  2653. 2    CONTINUE
  2654. 3    CONTINUE
  2655. C LO NOW IS LENGTH OF FORMULA
  2656.     DO 4 N1=1,LO
  2657.     WRK1(IHI)=WRK2(N1)
  2658.     IF(IHI.LT.110)IHI=IHI+1
  2659. 4    CONTINUE
  2660. C TACK ON ANY MORE TEXT
  2661. C RELY ON INLIN BEING 110 CHARS LONG
  2662.     DO 5 N1=LSTCHR,110
  2663.     WRK1(IHI)=INLIN(N1)
  2664.     IF(IHI.LT.110)IHI=IHI+1
  2665. 5    CONTINUE
  2666. C NOW COPY 110 CHARS BACK TO INLIN
  2667.     DO 6 N1=1,110
  2668. 6    INLIN(N1)=WRK1(N1)
  2669.     DO 7 N1=1,110
  2670.     LO=111-N1
  2671.     IF(ICHAR(INLIN(LO)).GT.32)GOTO 8
  2672. C    INLIN(LO)=CHAR(32)
  2673. 7    CONTINUE
  2674. 8    LEND=LO
  2675.     LCNT=LCNT+1
  2676.     GOTO 1000
  2677. C KEEP LOOKING & RECURSING BUT IMPOSE LIMIT
  2678. C    RETURN
  2679.     END
  2680. c -h- fvldgt.for    Fri Aug 22 13:10:38 1986    
  2681.         SUBROUTINE FVLDGT(ID1,ID2,IVAL)
  2682. C
  2683. C FVLDGT - RETURN FVLD BYTE GIVEN 2 DIMS OF ITS "LOCATION"
  2684.         InTeGer*4 ID1,ID2
  2685.         CHARACTER*1 IVAL
  2686. C NEXT BITMAPS IMPLEMENT FVLD
  2687.     EXTERNAL INDX
  2688.         CHARACTER*1 LBITS(8)
  2689.         COMMON/BITS/LBITS
  2690.         CHARACTER*1 FV1(2264),FV2(2264),FV4(2264)
  2691.     CHARACTER*1 FVXX(6792)
  2692.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(2265))
  2693.     EQUIVALENCE (FV4(1),FVXX(4529))
  2694.         Common/FVLDM/FVXX
  2695. c        COMMON/FVLDM/FV1,FV2,FV4
  2696. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  2697. C TYPES OF AC'S STORAGE:
  2698.         CHARACTER*1 ITYP(2264)
  2699.         InTeGer*4 IATYP(27)
  2700.         COMMON/TYP/IATYP,ITYP
  2701.     InTeGer*4 ICREF,IRREF
  2702. C    COMMON/MIRROR/ICREF,IRREF
  2703.     InTeGer*4 MODPUB,LIMODE
  2704. C    COMMON/MODPUB/MODPUB,LIMODE
  2705.     InTeGer*4 KLKC,KLKR
  2706.     REAL*8 AACP,AACQ
  2707. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  2708.     InTeGer*4 NCEL,NXINI
  2709. C    COMMON/NCEL/NCEL,NXINI
  2710.     CHARACTER*1 NAMARY(20,301)
  2711. C    COMMON/NMNMNM/NAMARY
  2712.     InTeGer*4 NULAST,LFVD
  2713. C    COMMON/NULXXX/NULAST,LFVD
  2714.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  2715.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  2716. CCC    InTeGer*4 ICREF,IRREF
  2717. CCC    COMMON/MIRROR/ICREF,IRREF
  2718. C
  2719. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  2720. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  2721. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  2722. C AREAS WITH DATA.
  2723.     InTeGer*4 DLFG
  2724. C    COMMON/DLFG/DLFG
  2725.     InTeGer*4 KDRW,KDCL
  2726. C    COMMON/DOT/KDRW,KDCL
  2727.     InTeGer*4 DTRENA
  2728. C    COMMON/DTRCMN/DTRENA
  2729.     REAL*8 EP,PV,FV
  2730.     DIMENSION EP(20)
  2731.     INTEGER*4 KIRR
  2732. C    COMMON/ERNPER/EP,PV,FV,KIRR
  2733.     InTeGer*4 LASTOP
  2734. C    COMMON/ERROR/LASTOP
  2735.     CHARACTER*1 FMTDAT(9,76)
  2736. C    COMMON/FMTBFR/FMTDAT
  2737.     CHARACTER*1 EDNAM(16)
  2738. C    COMMON/EDNAM/EDNAM
  2739.     InTeGer*4 MFID(2),MFMOD(2)
  2740. C    COMMON/FRM/MFID,MFMOD
  2741.     InTeGer*4 JMVFG,JMVOLD
  2742. C    COMMON/FUBAR/JMVFG,JMVOLD
  2743.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  2744.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  2745. CCC        CHARACTER*1 FMTDAT(9,76)
  2746. CCC        COMMON/FMTBFR/FMTDAT
  2747.         CHARACTER*1 I1,I2,I4
  2748.     CHARACTER*1 IT1,IT2,IT4,IT8
  2749.     LOGICAL*4 LT1,LT2,LT4,LT8
  2750.     InTeGer*4 KT1,KT2,KT4,KT8
  2751.     CHARACTER*1 IT12(2),IT22(2),IT42(2),IT82(2)
  2752.        EQUIVALENCE(LT1,IT12(1)),(LT2,IT22(1)),(LT4,IT42(1)),
  2753.      1(LT8,IT82(1))
  2754.        EQUIVALENCE(KT1,IT12(1)),(KT2,IT22(1)),(KT4,IT42(1)),
  2755.      1 (KT8,IT82(1))
  2756. C INTEL 8088 USES 1ST CHAR IN HIGH BYTE SO FORCE IT1, IT2, IT4 ETC TO LOW
  2757. C ORDER BYTE WITH EQUIVALENCES
  2758.     EQUIVALENCE(IT12(2),IT1),(IT22(2),IT2),(IT42(2),IT4),
  2759.      1 (IT82(2),IT8)
  2760.     IF(ID2.GT.0)GOTO 2000
  2761. C TRICK ENTRY USING ID IN FIRST ARG, 0 IN 2ND ARG...
  2762. C TELL XVBLST/XVBLGT ABOUT FV4 STATE (SET BY CALL WITH -4 BYTE ON FVLDST)
  2763.     ID=ID1
  2764.         IBT=((ID-1)/8)+1
  2765.     KT1=ID-1
  2766.     KT2=7
  2767.     KT1=IMASK(KT1,KT2)
  2768. C    LT1=LT1.AND.LT2
  2769.     IBIT=KT1+1
  2770. C        IBIT=((ID-1).AND.7)+1
  2771. C        I1=FV1(IBT).AND.LBITS(IBIT)
  2772. C        I2=FV2(IBT).AND.LBITS(IBIT)
  2773. C        I4=FV4(IBT).AND.LBITS(IBIT)
  2774.     KT1=ICHAR(FV1(IBT))
  2775.     KT2=ICHAR(FV2(IBT))
  2776.     KT4=ICHAR(FV4(IBT))
  2777.     KT8=ICHAR(LBITS(IBIT))
  2778.     KT1=IMASK(KT1,KT8)
  2779. C    LT1=LT1.AND.LT8
  2780.     KT2=IMASK(KT2,KT8)
  2781. C    LT2=LT2.AND.LT8
  2782.     KT4=IMASK(KT4,KT8)
  2783. C    LT4=LT4.AND.LT8
  2784.     I1=CHAR(KT1)
  2785.     I2=CHAR(KT2)
  2786.     I4=CHAR(KT4)
  2787.     IVAL=0
  2788. C RETURN NONZERO IF ANY BITS ARE SET.
  2789.     IF((KT1+KT2+KT4).NE.0)IVAL=1
  2790. C    IF((I1+I2+I4).NE.0)IVAL=1
  2791.     RETURN
  2792. 2000    CONTINUE
  2793. C REFLECT ALL BACK TO PRIME STORAGE REGION
  2794. C        ID=(ID2-1)*60+ID1
  2795.     IF(ID2.EQ.1.AND.ID1.LE.18060)GOTO 7806
  2796.     CALL REFLEC(ID2,ID1,ID)
  2797.     GOTO 7807
  2798. 7806    CONTINUE
  2799.     ID=ID1
  2800. 7807    IBT=((ID-1)/8)+1
  2801.     KT1=ID-1
  2802.     KT2=7
  2803.     KT1=IMASK(KT1,KT2)
  2804. C    LT1=LT1.AND.LT2
  2805.     IBIT=KT1+1
  2806. C        IBIT=((ID-1).AND.7)+1
  2807. C        I1=FV1(IBT).AND.LBITS(IBIT)
  2808. C        I2=FV2(IBT).AND.LBITS(IBIT)
  2809. C        I4=FV4(IBT).AND.LBITS(IBIT)
  2810.     KT1=ICHAR(FV1(IBT))
  2811.     KT2=ICHAR(FV2(IBT))
  2812.     KT4=ICHAR(FV4(IBT))
  2813.     KT8=ICHAR(LBITS(IBIT))
  2814. C    LT1=LT1.AND.LT8
  2815. C    LT2=LT2.AND.LT8
  2816. C    LT4=LT4.AND.LT8
  2817.     KT1=IMASK(KT1,KT8)
  2818.     KT2=IMASK(KT2,KT8)
  2819.     KT4=IMASK(KT4,KT8)
  2820. C    I1=CHAR(KT1)
  2821. C    I2=CHAR(KT2)
  2822. C    I4=CHAR(KT4)
  2823.         IVL=0
  2824.         IF(KT1.NE.0)IVL=1
  2825.         IF(KT2.NE.0)IVL=IVL+2
  2826.         IF(KT4.NE.0)IVL=-IVL
  2827.         IVAL=CHAR(IVL)
  2828. C READS OFF FVLD BYTE FROM 3 BITS, HIGH ONE IS SIGN. TREAT AS SIGN-
  2829. C MAGNITUDE NUMBER IN RANGE -3 TO +3,
  2830.         RETURN
  2831.         END
  2832. c -h- fvldst.for    Fri Aug 22 13:10:51 1986    
  2833.         SUBROUTINE FVLDST(ID1,ID2,IVAL)
  2834. C
  2835. C FVLDST - SET THE BYTE IN FVLD ARRAY
  2836. C NEXT BITMAPS IMPLEMENT FVLD
  2837.         CHARACTER*1 FV1(2264),FV2(2264),FV4(2264)
  2838.     CHARACTER*1 FVXX(6792)
  2839.     EQUIVALENCE (FV1(1),FVXX(1)),(FV2(1),FVXX(2265))
  2840.     EQUIVALENCE (FV4(1),FVXX(4529))
  2841.         Common/FVLDM/FVXX
  2842. c        COMMON/FVLDM/FV1,FV2,FV4
  2843.         CHARACTER*1 IVAL
  2844.         CHARACTER*1 LBITS(8)
  2845.     EXTERNAL INDX
  2846.         COMMON/BITS/LBITS
  2847. C THE FOLLOWING BITMAP IS FOR TYPE ARRAY, AND INTEGER ARRAY IS FOR
  2848. C TYPES OF AC'S STORAGE:
  2849.         CHARACTER*1 ITYP(2264)
  2850.         InTeGer*4 IATYP(27)
  2851.         COMMON/TYP/IATYP,ITYP
  2852.     InTeGer*4 ICREF,IRREF
  2853. C    COMMON/MIRROR/ICREF,IRREF
  2854.     InTeGer*4 MODPUB,LIMODE
  2855. C    COMMON/MODPUB/MODPUB,LIMODE
  2856.     InTeGer*4 KLKC,KLKR
  2857.     REAL*8 AACP,AACQ
  2858. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  2859.     InTeGer*4 NCEL,NXINI
  2860. C    COMMON/NCEL/NCEL,NXINI
  2861.     CHARACTER*1 NAMARY(20,301)
  2862. C    COMMON/NMNMNM/NAMARY
  2863.     InTeGer*4 NULAST,LFVD
  2864. C    COMMON/NULXXX/NULAST,LFVD
  2865.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  2866.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  2867. CCC    InTeGer*4 ICREF,IRREF
  2868. CCC    COMMON/MIRROR/ICREF,IRREF
  2869. C
  2870. C NEXT ARE BUFFERS FOR HOLDING VALUES, AND MEMORY OCCUPANCY WORDS
  2871. C FOR EACH GIVING THE BLK # IN USE FOR THESE TABLES
  2872. C FORMAT BLOCK (ONE ONLY, 512 BYTES, BUT ORGANIZED AS 76 FORMAT
  2873. C AREAS WITH DATA.
  2874.     InTeGer*4 DLFG
  2875. C    COMMON/DLFG/DLFG
  2876.     InTeGer*4 KDRW,KDCL
  2877. C    COMMON/DOT/KDRW,KDCL
  2878.     InTeGer*4 DTRENA
  2879. C    COMMON/DTRCMN/DTRENA
  2880.     REAL*8 EP,PV,FV
  2881.     DIMENSION EP(20)
  2882.     INTEGER*4 KIRR
  2883. C    COMMON/ERNPER/EP,PV,FV,KIRR
  2884.     InTeGer*4 LASTOP
  2885. C    COMMON/ERROR/LASTOP
  2886.     CHARACTER*1 FMTDAT(9,76)
  2887. C    COMMON/FMTBFR/FMTDAT
  2888.     CHARACTER*1 EDNAM(16)
  2889. C    COMMON/EDNAM/EDNAM
  2890.     InTeGer*4 MFID(2),MFMOD(2)
  2891. C    COMMON/FRM/MFID,MFMOD
  2892.     InTeGer*4 JMVFG,JMVOLD
  2893. C    COMMON/FUBAR/JMVFG,JMVOLD
  2894.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  2895.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  2896. CCC        CHARACTER*1 FMTDAT(9,76)
  2897.     InTeGer*4 IVV,I1,I2,I3,ITA
  2898.     LOGICAL*4 L2,L1,LVV,LTA
  2899.     EQUIVALENCE(L2,I2),(L1,I1),(LVV,IVV)
  2900.     EQUIVALENCE(LTA,ITA)
  2901. CCC        COMMON/FMTBFR/FMTDAT
  2902.     CHARACTER*1 IT1,IT2,IT4,IT8
  2903.     LOGICAL*4 LT1,LT2,LT4,LT8
  2904.     InTeGer*4 KT1,KT2,KT4,KT8,KW1,KW2
  2905.     CHARACTER*1 IT12(2),IT22(2),IT42(2),IT82(2)
  2906.     EQUIVALENCE(LT1,IT12(1)),(LT2,IT22(1)),(LT4,IT42(1)),
  2907.      1  (LT8,IT82(1))
  2908.     EQUIVALENCE(KT1,IT12(1)),(KT2,IT22(1)),(KT4,IT42(1)),
  2909.      1  (KT8,IT82(1))
  2910. C INTEL 8088 USES 1ST CHAR IN HIGH BYTE SO FORCE IT1, IT2, IT4 ETC TO LOW
  2911. C ORDER BYTE WITH EQUIVALENCES
  2912. C    EQUIVALENCE(IT12(2),IT1),(IT22(2),IT2),(IT42(2),IT4),
  2913. C     1  (IT82(2),IT8)
  2914. C        CHARACTER*1 I4
  2915.     IF(ID2.EQ.1.AND.ID1.LE.18060)GOTO 7806
  2916. C ALLOW DELIBERATE CALL WITH EFFECTIVELY ONE ARG.
  2917. 7807    CALL REFLEC(ID2,ID1,ID)
  2918.     GOTO 7808
  2919. 7806    CONTINUE
  2920. C        ID=(ID2-1)*60+ID1
  2921.     ID=ID1
  2922. 7808    IBT=((ID-1)/8)+1
  2923.     KT1=ID-1
  2924.     KT2=7
  2925.     KT1=IMASK(KT1,KT2)
  2926. C    LT1=LT1.AND.LT2
  2927.     IBIT=KT1+1
  2928. C        IBIT=((ID-1).AND.7)+1
  2929. C ZERO ALL 3 FVLD BITS FIRST
  2930. C        FV1(IBT)=FV1(IBT).AND..NOT.LBITS(IBIT)
  2931. C        FV2(IBT)=FV2(IBT).AND..NOT.LBITS(IBIT)
  2932. C        FV4(IBT)=FV4(IBT).AND..NOT.LBITS(IBIT)
  2933.     KT1=ICHAR(FV1(IBT))
  2934.     KT2=ICHAR(FV2(IBT))
  2935.     KT4=ICHAR(FV4(IBT))
  2936.     KT8=ICHAR(LBITS(IBIT))
  2937.     ITA=-KT8-1
  2938. C ITA IS NOW THE COMPLEMENT OF KT8
  2939. C THUS, THE SELECTED BIT IS OFF IN IT, ALL OTHERS ON.
  2940. C    LT1=LT1.AND.LTA
  2941. C    LT2=LT2.AND.LTA
  2942. C    LT4=LT4.AND.LTA
  2943.     KT1=IMASK(KT1,ITA)
  2944.     KT2=IMASK(KT2,ITA)
  2945.     KT4=IMASK(KT4,ITA)
  2946. C FILL IN ALL 3 BITMAPS WITH THEIR PREVIOUS CONTENTS EXCEPT THE
  2947. C CHOSEN BITS.
  2948.     FV1(IBT)=CHAR(KT1)
  2949.     FV2(IBT)=CHAR(KT2)
  2950.     FV4(IBT)=CHAR(KT4)
  2951.     IVVV=JCHAR(IVAL)
  2952.         IVV=IABS(IVVV)
  2953.         I3=0
  2954.         IF(IVVV.LT.0)I3=1
  2955. C    I1=1
  2956. C    I2=2
  2957.     KW2=2
  2958.     KW1=1
  2959.     I2=IMASK(IVV,KW2)
  2960.     I1=IMASK(IVV,KW1)
  2961. C        L2=LVV.AND.L2
  2962. C        L1=LVV.AND.L1
  2963. C NOTE WE ASSUME HEAVILY THAT LOGICAL OPERATIONS WORK BY BINARY
  2964. C ANDS AND ORS IN DATA.
  2965. C ** NOTE WE DON'T NEED TO RELOAD THE KT1 THRU KT4 INTEGERS... ALL ALREADY
  2966. C ARE LOADED... DITTO KT8
  2967. C    KT1=ICHAR(FV1(IBT))
  2968. C    KT2=ICHAR(FV2(IBT))
  2969. C    KT4=ICHAR(FV4(IBT))
  2970. C    KT8=ICHAR(LBITS(IBIT))
  2971.     LT1=LT1.OR.LT8
  2972.     LT2=LT2.OR.LT8
  2973.     LT4=LT4.OR.LT8
  2974. C        IF(I1.NE.0)FV1(IBT)=FV1(IBT).OR.LBITS(IBIT)
  2975. C        IF(I2.NE.0)FV2(IBT)=FV2(IBT).OR.LBITS(IBIT)
  2976. C        IF(I3.NE.0)FV4(IBT)=FV4(IBT).OR.LBITS(IBIT)
  2977.         IF(I1.NE.0)FV1(IBT)=CHAR(KT1)
  2978.         IF(I2.NE.0)FV2(IBT)=CHAR(KT2)
  2979.         IF(I3.NE.0)FV4(IBT)=CHAR(KT4)
  2980.         RETURN
  2981.         END
  2982. c -h- fvpeek.fms    Fri Aug 22 13:11:27 1986    
  2983. C DUMMY FVPEEK
  2984.     SUBROUTINE FVPEEK(ID1,ID2,IGO)
  2985.     InTeGer*4 ID1,ID2,IGO
  2986.     IGO=ID1
  2987.     RETURN
  2988.     END
  2989. c -h- getfnl.for    Fri Aug 22 13:12:09 1986    
  2990.     SUBROUTINE GETFNL(LINE,LSKP,LLEN)
  2991. C PARSE OUT FILENAME AND GET LSKP, LLEN NUMBERS
  2992.     EXTERNAL INDX
  2993.     CHARACTER*1 LINE(80)
  2994.     InTeGer*4 LSKP,LLEN,LO,HI
  2995.     LSKP=0
  2996.     LLEN=32000
  2997. C SET INITIAL NUMBERS TO READ WHOLE FILE
  2998.     KKK=ICHAR(',')
  2999.     N=INDX(LINE,KKK)
  3000.     IF(N.LE.0.OR.N.GT.78)RETURN
  3001. C IF CANNOT FIND COMMA, JUST SKIP OUT & TRY TO CATCH ERRORS ON OPEN.
  3002.     LINE(N)=0
  3003. C NULL TERMINATE FILENAME
  3004.     LO=N+1
  3005.     HI=LO+20
  3006.     CALL GN(LO,HI,LSKP,LINE)
  3007.     LO=N+1
  3008.     KKK=ICHAR(',')
  3009.     N=INDX(LINE(LO),KKK)
  3010.     IF(N.LE.0.OR.N.GT.30)RETURN
  3011.     LO=LO+N
  3012.     HI=LO+20
  3013.     CALL GN(LO,HI,LLEN,LINE)
  3014. C SHOULD HAVE NUMBERS NOW
  3015.     RETURN
  3016.     END
  3017. c -h- getlog.for    Fri Aug 22 13:12:16 1986    
  3018.     SUBROUTINE GETLOG(LINE,LMX,LOGTYP,LASST)
  3019.     CHARACTER*1 LINE(110)
  3020.     EXTERNAL INDX
  3021.     CHARACTER*1 LFN(4,6)
  3022.     CHARACTER*4 XLF(6)
  3023.     INTEGER*4 LF(6)
  3024.     EQUIVALENCE(XLF(1)(1:1),LF(1),LFN(1,1))
  3025. C    EQUIVALENCE(LF(1),LFN(1,1))
  3026.     DATA XLF/'.GT.','.LT.','.EQ.','.NE.','.GE.','.LE.'/
  3027. C LOGTYP RELATIONSHIP TO RELATIONSHIPS OF 2 VARIABLES
  3028. C IS DEFINED IN ABOVE DATA STMT.
  3029. C IF LINE CONTAINS STRING IN NAME, RETURN TYPE AND END LOC.
  3030.     LMX4=LMX-3
  3031.     DO 100 LL=1,6
  3032.     LOGTYP=LL
  3033.     DO 1 N1=1,LMX4
  3034.     IF(LINE(N1  ).NE.LFN(1,LL))GOTO 2
  3035.     IF(LINE(N1+1).NE.LFN(2,LL))GOTO 2
  3036.     IF(LINE(N1+2).NE.LFN(3,LL))GOTO 2
  3037.     IF(LINE(N1+3).NE.LFN(4,LL))GOTO 2
  3038. C HERE HAVE A MATCH
  3039.     LASST=N1
  3040. C RETURN LOC OF NEXT CHAR AFTER RELATION.
  3041.     GOTO 200
  3042. 2    CONTINUE
  3043. 1    CONTINUE
  3044. 100    CONTINUE
  3045.     LOGTYP=0
  3046. 200    CONTINUE
  3047.     RETURN
  3048.     END
  3049. c -h- getnnb.for    Fri Aug 22 13:13:44 1986    
  3050.     SUBROUTINE GETNNB(IPT,RETCD)
  3051. C COPYRIGHT (C) 1983 GLENN EVERHART
  3052. C ALL RIGHTS RESERVED
  3053. C 60=MAX REAL ROWS
  3054. C 301=MAX REAL COLS
  3055. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  3056. C VBLS AND TYPE DIMENSIONED 60,301
  3057. C **************************************************
  3058.  
  3059. C *                                                *
  3060. C *         SUBROUTINE GETNNB(IPT,RETCD)           *
  3061. C *                                                *
  3062. C **************************************************
  3063. C
  3064. C
  3065. C  GET NEXT NON-BLANK ELEMENT FROM LINE STARTING AT NONBLK+1
  3066. C
  3067. C  RETCD =  1   O.K.
  3068. C        2   NO NON-BLANK FOUND
  3069. C
  3070. C  IPT POINTS TO POSITION IN LINE WHERE NEXT NON-BLANK IS FOUND.
  3071. C  IT IS UP TO CALLING PROGRAM TO RESET NONBLK FOR NEXT SCAN.
  3072. C
  3073. C
  3074. C
  3075. C GETNNB IS CALLED BY
  3076. C
  3077. C AT
  3078. C BASCNG
  3079. C CMND
  3080. C NEXTEL
  3081. C STRCMP
  3082. C
  3083. C
  3084. C   VARIABLE    USE
  3085. C
  3086. C    BLANK      ' '
  3087. C    IPT        RETURNS POSITION OF NEXT NON-BLANK.
  3088. C    K          HOLDS TEMPORARY VALUES.
  3089. C    LEND       LAST NON-BLANK IN LINE(80).
  3090. C    NONBLK     HOLDS CHARACTER TO LEFT OF THE START OF THE SCAN.
  3091. C    RETCD      HOLDS THE RETURN CODE. 1=O.K.  2=THE REST IS BLANKS.
  3092. C
  3093. C
  3094. C    SUBROUTINE GETNNB(IPT,RETCD)
  3095. C
  3096. C
  3097.     InTeGer*4 IPT
  3098.     InTeGer*4 LEVEL,NONBLK,LEND
  3099.     InTeGer*4 VIEWSW,BASED,BASE,RETCD
  3100.     InTeGer*4 K
  3101. C
  3102.     CHARACTER*1 LINE(80),ALPHA(27),COMMA,BLANK,RPAR,LPAR,EQ
  3103. C
  3104.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  3105.     COMMON /CONS/ ALPHA,COMMA,BLANK,RPAR,LPAR,EQ
  3106. C
  3107.     RETCD=1
  3108.     IF (NONBLK.GE.LEND) GOTO 999
  3109. C
  3110. C AT LEAST 1 NON-BLANK EXISTS.
  3111.     K=NONBLK+1
  3112.     DO 10 IPT=K,LEND
  3113.     IF (LINE(IPT).NE.BLANK) GOTO 1000
  3114. 10    CONTINUE
  3115. C
  3116. C
  3117. C ACTUALLY, SHOULD NEVER FALL THROUGH IF 'LEND' IS SET CORRECTLY.
  3118. C
  3119. C
  3120. C THE REST ARE BLANKS
  3121. 999    RETCD=2
  3122. 1000    RETURN
  3123.     END
  3124. c -h- getttl.for    Fri Aug 22 13:14:41 1986    
  3125.     SUBROUTINE GETTTL(LINE)
  3126.     CHARACTER*1 LINE(132)
  3127.     CHARACTER*3 FNAME
  3128.     CHARACTER*1 FN(3)
  3129.     EQUIVALENCE (FN(1),FNAME(1:1))
  3130.     InTeGer*4 IBBX
  3131.     InTeGer*4 ICREF,IRREF
  3132. C    COMMON/MIRROR/ICREF,IRREF
  3133.     InTeGer*4 MODPUB,LIMODE
  3134. C    COMMON/MODPUB/MODPUB,LIMODE
  3135.     InTeGer*4 KLKC,KLKR
  3136.     REAL*8 AACP,AACQ
  3137. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  3138.     InTeGer*4 NCEL,NXINI
  3139. C    COMMON/NCEL/NCEL,NXINI
  3140.     CHARACTER*1 NAMARY(20,301)
  3141. C    COMMON/NMNMNM/NAMARY
  3142.     InTeGer*4 NULAST,LFVD
  3143. C    COMMON/NULXXX/NULAST,LFVD
  3144.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  3145.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  3146. CCC    COMMON/MODPUB/MODPUB,LIMODE
  3147. C MODPUB = MODE USED IN CMD MODE GTMODE ROUTINE
  3148.     InTeGer*4 RRWACT,RCLACT
  3149. C    COMMON/RCLACT/RRWACT,RCLACT
  3150.     InTeGer*4 idol1,idol2,idol3,idol4,idol5,idol6,
  3151.      1  IDOL7,IDOL8
  3152. C    common/dollr/idol1,idol2,idol3,idol4,idol5,idol6,
  3153. C     1  IDOL7,IDOL8
  3154.     InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  3155. C    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV
  3156.     InTeGer*4 IPGMAX,LPGMXF,IPGMOD,LPGMOD
  3157. C    COMMON/FILEMX/IPGMAX,LPGMXF,IPGMOD,LPGMOD
  3158. C LENGTHS (IN K) OF FILES FOR VALUES OR FORMULAS ARE IPGMAX,LPGMXF
  3159. C IPGMOD AND LPGMOD CONTROL PACKING MODE IN THE CORRESPONDING FILES
  3160.     InTeGer*4 KLVL
  3161. C    COMMON/KLVL/KLVL
  3162.     InTeGer*4 IOLVL,IGOLD
  3163. C    COMMON/IOLVL/IOLVL
  3164. C IOLVL IS LUN FOR XQTCMD TO USE (NORMALLY 3 FOR INDIRECT FILES OR 5
  3165. C FOR TERMINAL. WE USE 5,6 FOR TERMINAL INPUT, OUTPUT NORMALLY.
  3166.     COMMON/RDD/RRWACT,RCLACT,idol1,idol2,idol3,idol4,idol5,idol6,
  3167.      1  IDOL7,IDOL8,PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP,
  3168.      2  IPGMAX,LPGMXF,IPGMOD,LPGMOD,KLVL,IOLVL,IGOLD
  3169. CCC    InTeGer*4 LLCMD,LLDSP
  3170. CCC    InTeGer*4 PROW,PCOL,DROW,DCOL,DRWV,DCLV
  3171. CCC    COMMON/DCTL/PROW,PCOL,DROW,DCOL,DRWV,DCLV,LLCMD,LLDSP
  3172. C LIMODE IS WHAT GETS SET UP IN /# CMND
  3173.     IBBX=0
  3174. C
  3175. C
  3176. C
  3177. C
  3178. C CODE FOR FORTRAN READ...
  3179. C  **** HERE IS THE SECTION OF CODE YOU NEED FOR NON-VMS-SPECIFIC VERSION
  3180. C NOTE READS UNIT 0 TO GET CONSOLE.
  3181. C CHECK THAT WE'RE READING CONSOLE. IF LUN 5 IS OFF CONSOLE, THEN
  3182. C READ USING DIRECT DOS CALLS.
  3183. C  IF (STILL) IN AN INITIALIZER FILE, READ USING REGULAR FORTRAN READS
  3184. C AND ACT NORMALLY.
  3185. C  DISCOVER CONSOLE BECAUSE FILENAME IS 'CON:' OR 'CON'.
  3186. CC    INQUIRE(UNIT=5,NAME=FNAME)
  3187. CC    IF (FN(1).NE.'C'.OR.FN(2).NE.'O'.OR.FN(3).NE.'N')
  3188. CC     1 GOTO 5000
  3189. C CALL ASSEMBLER ROUTINE TO GET CHARACTERS.
  3190.     DO 5001 N=1,132
  3191. 5001    LINE(N)=CHAR(0)
  3192. C FIX IT UP SO A NULL LINE LOOKS HARMLESS...
  3193.     LINE(1)=' '
  3194. C NULL THE LINE FIRST IN FORTRAN; MAKES IT EASIER TO DO ASSEMBLER STUFF.
  3195.     CALL TTYIN(MODPUB,LINE)
  3196.     IF(LINE(1).NE.'/')GOTO 5540
  3197. C DISPLAY HELP MSG AT BOTTOM
  3198.     IF(MODPUB.EQ.0)GOTO 5540
  3199. C ONLY DISPLAY IF IN "AUTOENTER" MODE
  3200. c    CALL UVT100(1,LLDSP,1)
  3201. c    CALL SWRT('Add,Cpy,Dsp,Fil,Get,Kalc,Loc,Mov,Put,Recal,Set',46)
  3202. c    CALL SWRT(',Tst,View,Wrt,Xit,Zap,/,Help',28)
  3203. c    CALL UVT100(1,LLCMD,11)
  3204. C CALL TTYIN NEXT WITH 0 SO / ISN'T TERMINATOR.
  3205. c    N=0
  3206. C    CALL TTYIN(N,LINE(2))
  3207. 5540    CONTINUE
  3208.     IF(ICHAR(LINE(1)).EQ.26)
  3209.      1  GOTO 2000
  3210. C Add,Copy,Dsp,Fil,Get,Kalc,Loc,Mov,Put,Recal,Set,Test,View,Wrt,Xit,Zap,Help,/
  3211. C READ IN AFTER CLOSE AND RE-OPEN IF WE GET EOF ON INPUT SIGNALLED
  3212. C BY CONTROL Z.
  3213. C ASSUME WE'LL USE DOS FUNCTION 1 FOR READIN AND ECHO
  3214. C AND THEN END THE READIN AFTER FIRST CONTROL SEQUENCE.
  3215. C    GOTO 6000
  3216. C5000    CONTINUE
  3217. C    READ(5,1000,END=2000,ERR=2000)LINE
  3218. 1000    FORMAT(132A1)
  3219. 6000    CONTINUE
  3220. CC    IF(ICHAR(LINE(1)).NE.0)RETURN
  3221. CCC IF WE GET 0 MAYBE IT'S AN EXTENDED CODE. TRY RETURNING A HASHED
  3222. CCC VALUE HERE. USE __{CELL WHERE CELL IS A FOLLOWED BY (B+CODE) WHERE
  3223. CC CODE IS THE VALUE RETURNED...
  3224. CC    LINE(5)=CHAR(ICHAR(LINE(2))+66-59)
  3225. CC EXTENDED CODES WE CARE ABOUT START AT 59.
  3226. CC MAP INTO EXTENDED AC'S STARTING AT AB SINCE AA IS THE SAME AS % ACCUMULATOR
  3227. CC WHICH CAN'T BE REASSIGNED THIS WAY.
  3228. C    LINE(5)=CHAR(ICHAR(LINE(2))+7)
  3229. C    LINE(1)='_'
  3230. C    LINE(2)='_'
  3231. C    LINE(3)='{'
  3232. C    LINE(4)='A'
  3233. C
  3234. C WE SHOULD "KNOW" COORDS HERE DESIRED...
  3235. C THEY RUN FROM B TO Z...IMPLYING ID1=28 THRU 53
  3236. CC    II=ICHAR(LINE(5))-66+28
  3237. C    II=ICHAR(LINE(5))-38
  3238. C SCREEN OUT EXTRA JUNK THAT WOULD COME FROM HIGH FUNCT CODES...
  3239. C (DON'T BOTHER MAPPING A<Z+1> TO BA AND SO ON... ONLY 6
  3240. C KEYS IN USABLE RANGE ANYHOW...
  3241. C    IF(II.GT.52)GOTO 1200
  3242. C    III=1
  3243. C    CALL FVLDGT(II,III,IBBX)
  3244. C    IF(IBBX.EQ.0)GOTO 1200
  3245. C SKIP OVER CELLS THAT ARE EMPTY.
  3246. C
  3247. C NULL OUT REMAINDER OF THE LINE TO AVOID CONFUSION HERE.
  3248. C NOTE WE ONLY DO THIS WHERE WE SAW AN INITIAL NULL INDICATING AN
  3249. C EXTENDED FUNCTION INPUT.
  3250. C    IBBX=6
  3251. C    GOTO 1201
  3252. C1200    IBBX=1
  3253. C1201    CONTINUE
  3254. C    DO 1100 N=IBBX,132
  3255. C1100    LINE(N)=CHAR(0)
  3256.     RETURN
  3257. 2000    CONTINUE
  3258. c    CLOSE(18)
  3259.     IOLVL=11
  3260. c    OPEN(18,FILE='CON:20/40/150/150/Analy Command Input')
  3261.     CLOSE(3)
  3262. CC RETRY A READ AFTER EOF...
  3263. Cc try a write to 5 to see if that'll reset the file
  3264.     Rewind 11
  3265.     write(11,4002)
  3266. 4002    format(' *eof*')
  3267.     Rewind 11
  3268.     READ(11,1000,END=4000,ERR=4000)LINE
  3269.     rewind 11
  3270.     RETURN
  3271. 4000    CONTINUE
  3272. CC IF WE KEEP GETTING ERRORS, JUST QUIT.
  3273. CC AT LEAST STAY AROUND. USER CAN DO @\DEV\CON
  3274. CC TO PARTLY RECOVER...
  3275. C    STOP
  3276. C TRY TO RESET TTY EOF
  3277. C *********
  3278.     RETURN
  3279.     END
  3280. c -h- gmadd.for    Fri Aug 22 13:16:31 1986    
  3281.     SUBROUTINE GMADD(IA1,IA2,IB1,IB2,IR1,IR2,N,M)
  3282. C MODIFIED FOR PCCPC
  3283. C      SUBROUTINE GMADD(A,B,R,N,M)
  3284.        REAL*8 A,B,R
  3285.        DIMENSION A(1),B(1),R(1)
  3286. C      NM=N*M
  3287.     IAB=(IA2-1)*60+IA1-1
  3288.     IBB=(IB2-1)*60+IB1-1
  3289.     IRB=(IR2-1)*60+IR1-1
  3290.       DO 10 I=1,N
  3291.       DO 10 J=1,M
  3292.     IJ=(I-1)*60+J
  3293.     CALL XVBLGT(IJ+IAB,0,A)
  3294.     CALL XVBLGT(IJ+IBB,0,B)
  3295.     R(1)=A(1)+B(1)
  3296.     CALL XVBLST(IJ+IRB,0,R)
  3297. 10    CONTINUE
  3298. C   10 R(IJ)=A(IJ)+B(IJ)
  3299.       RETURN
  3300.       END
  3301. c -h- gmprd.for    Fri Aug 22 13:16:31 1986    
  3302.     SUBROUTINE GMPRD(IA1,IA2,IB1,IB2,IR1,IR2,N,M,L)
  3303. C      SUBROUTINE GMPRD(A,B,R,N,M,L)
  3304.     REAL*8 A,B,R
  3305.         DIMENSION A(1),B(1),R(1)
  3306. C SPECIAL MATRIX MULTIPLY WITHIN SPREADSHEET MATRIX
  3307.     IAB=(IA2-1)*60+IA1-1
  3308.     IBB=(IB2-1)*60+IB1-1
  3309.     IRB=(IR2-1)*60+IR1-1
  3310.     DO 10 K=1,L
  3311.     DO 10 J=1,M
  3312.     NL=(J-1)*60+K
  3313.     R(1)=0.
  3314.     CALL XVBLST(IRB+NL,0,R)
  3315.     DO 10 I=1,N
  3316.     NM=(J-1)*60+I
  3317.     ML=(I-1)*60+K
  3318.     CALL XVBLGT(IAB+NM,0,A)
  3319.     CALL XVBLGT(IBB+ML,0,B)
  3320.     A(1)=A(1)*B(1)
  3321.     CALL XVBLGT(IRB+NL,0,R)
  3322.     R(1)=R(1)+A(1)
  3323. 10    CALL XVBLST(IRB+NL,0,R)
  3324. C    R(NL)=R(NL)+A(NM)*B(ML)
  3325. C10    CONTINUE
  3326.       RETURN
  3327.       END
  3328. c -h- gmsub.for    Fri Aug 22 13:16:31 1986    
  3329.     SUBROUTINE GMSUB(IA1,IA2,IB1,IB2,IR1,IR2,N,M)
  3330. C      SUBROUTINE GMSUB(A,B,R,N,M)
  3331.     REAL*8 A,B,R
  3332.     IAB=(IA2-1)*60+IA1-1
  3333.     IBB=(IB2-1)*60+IB1-1
  3334.     IRB=(IR2-1)*60+IR1-1
  3335. C      NM=N*M
  3336.       DO 10 I=1,N
  3337.       DO 10 J=1,M
  3338.       IJ=(I-1)*60+J
  3339.     CALL XVBLGT(IAB+IJ,0,A)
  3340.     CALL XVBLGT(IBB+IJ,0,B)
  3341.     A=A-B
  3342.     CALL XVBLST(IRB+IJ,0,A)
  3343. 10    CONTINUE
  3344. C   10 R(IJ)=A(IJ)-B(IJ)
  3345.       RETURN
  3346.       END
  3347. c -h- gmtx.for    Fri Aug 22 13:16:31 1986    
  3348.     SUBROUTINE GMTX(LINE,IBGN,LSTCHR,ID1A,ID2A,ID1B,
  3349.      1  ID2B,RETCD)
  3350.  
  3351.     CHARACTER*1 LINE(80)
  3352. C REQ END MTX NAME IN 20 CHARS.
  3353. C SHOULD BE OK
  3354.     LEND=IBGN+20
  3355. C GET LOC OF MATRIX A (MUST BE SQUARE)
  3356.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1A,ID2A,IVALID)
  3357.     IF(IVALID.EQ.0)GOTO 300
  3358.     IF(LINE(LSTCHR).NE.':')GOTO 300
  3359.     IBGN=LSTCHR+1
  3360.     LEND=IBGN+20
  3361.     CALL VARSCN(LINE,IBGN,LEND,LSTCHR,ID1B,ID2B,IVALID)
  3362.     IF(IVALID.EQ.0)GOTO 300
  3363. 1000    RETURN
  3364. 300    RETCD=3
  3365.     RETURN
  3366.     END
  3367. c -h- gn.for    Fri Aug 22 13:16:49 1986    
  3368.     SUBROUTINE GN(LAST,LEND,NUM,LINE)
  3369.     IMPLICIT InTeGer*4(A-Z)
  3370. C    PARAMETER 1=1,14=14
  3371.     DIMENSION LINE(110)
  3372.     CHARACTER*1 LINE
  3373.     EXTERNAL INDX
  3374.     CHARACTER*1 NCH
  3375.     InTeGer*4 CH,SFG
  3376.     NUM=0
  3377.     JSSF=0
  3378.     ISSF=0
  3379.     CH=0
  3380.     SFG=1
  3381.     NCH=0
  3382.     DO 1 N=LAST,LEND
  3383.     M=N
  3384.     NCH=LINE(N)
  3385.     CH=ICHAR(NCH)
  3386.     IF(CH.EQ.0)GOTO 2
  3387.     IF(CH.EQ.45)SFG=-1
  3388. C SFG=SIGN FLAG
  3389. C 43 IS ASCII FOR +; 45 IS ASCII FOR - SIGN.
  3390. C IGNORE + SIGNS
  3391.     IF(CH.GT.32)ISSF=ISSF+1
  3392.     IF(ISSF.EQ.0.AND.CH.EQ.32)GOTO 1
  3393. C IGNORE SPACES TOO, PROVIDED THEY ARE LEADING SPACES.
  3394. C (OTHERS MAY BE DELIMITERS.)
  3395.     IF(CH.EQ.43.OR.CH.EQ.45)JSSF=JSSF+1
  3396.     IF(JSSF.GT.1.AND.(CH.EQ.43.OR.CH.EQ.45))GOTO 2
  3397. C IF WE HAVEN'T SEEN A +/- PROCESS IT HERE.
  3398.     IF(CH.EQ.43)GOTO 1
  3399.     IF(CH.EQ.45)GOTO 1
  3400.     IF(CH.LT.48.OR.CH.GT.57)GOTO 2
  3401. C TERMINATE ON ANY NON NUMERIC. SHOULD ALLOW TERMINATE ON SECOND #.
  3402.     IF(NUM.LT.3100)NUM=10*NUM+(CH-48)
  3403. 1    CONTINUE
  3404. C NEXT LINE WAS MAX0...
  3405. 2    LAST=MIN0(M,LEND)
  3406.     NUM=NUM*SFG
  3407. C ACCOUNTED FOR SIGN; NOW RETURN
  3408.     RETURN
  3409.     END
  3410. c -h- gtmung.for    Fri Aug 22 13:17:12 1986    
  3411.     SUBROUTINE GTMUNG(LINE)
  3412.     CHARACTER*1 LINE(132)
  3413.     InTeGer*4 IMODE
  3414.     CHARACTER*1 C2
  3415.     InTeGer*4 ICREF,IRREF
  3416. C    COMMON/MIRROR/ICREF,IRREF
  3417.     InTeGer*4 MODPUB,LIMODE
  3418. C    COMMON/MODPUB/MODPUB,LIMODE
  3419.     InTeGer*4 KLKC,KLKR
  3420.     REAL*8 AACP,AACQ
  3421. C    COMMON/MSCMN/KLKC,KLKR,AACP,AACQ
  3422.     InTeGer*4 NCEL,NXINI
  3423. C    COMMON/NCEL/NCEL,NXINI
  3424.     CHARACTER*1 NAMARY(20,301)
  3425. C    COMMON/NMNMNM/NAMARY
  3426.     InTeGer*4 NULAST,LFVD
  3427. C    COMMON/NULXXX/NULAST,LFVD
  3428.     COMMON/NULETC/ICREF,IRREF,MODPUB,LIMODE,
  3429.      1  KLKC,KLKR,AACP,AACQ,NCEL,NXINI,NAMARY,NULAST,LFVD
  3430. CCC    COMMON/MODPUB/MODPUB,LIMODE
  3431.     DATA IMODE/0/
  3432. C HANDLE EXTRA MODE PARSING...DEFAULT,TO AVOID ENTER CMD IF NOT NEEDED.
  3433.     I=ICHAR(LINE(1))
  3434.     IF(I.LT.34.OR.I.GT.122)GOTO 6000
  3435.     IF(I.EQ.42)GOTO 6000
  3436. C ASSUME OTHER REASONABLE CHARS ARE CMDS
  3437.     IF(I.GT.34.AND.I.LT.40)GOTO 6000
  3438.     IF(I.EQ.95)GOTO 6000
  3439.     IF(I.GE.58.AND.I.LE.64)GOTO 6000
  3440.     IF(LINE(1).NE.'/')GOTO 100
  3441.     IF(LINE(2).NE.'/')GOTO 110
  3442. C SETUP OLD MODE WITH //
  3443.     IMODE=0
  3444.     GOTO 900
  3445. 110    CONTINUE
  3446.     IF(LINE(2).NE.';')GOTO 120
  3447. C SETUP NEW MODE WITH /;
  3448.     IMODE=1
  3449.     GOTO 900
  3450. 120    CONTINUE
  3451.     IF(LINE(2).NE.'#')GOTO 124
  3452. C SWAP OLD, CURRENT MODES
  3453. C USE IN CMD FILES SO /# SWAPS MODES, THEN // SETS OLD MODE,
  3454. C THEN /# SWAPS BACK
  3455. C (THAT WAY, USER'S MODE DOESN'T CHANGE.)
  3456.     I=LIMODE
  3457.     LIMODE=IMODE
  3458.     IMODE=I
  3459.     GOTO 900
  3460. 124    CONTINUE
  3461.     IF(IMODE.EQ.0)GOTO 6000
  3462. C IF WE JUST SAW /COMMAND, MUNGE OUT THE INITIAL /
  3463.     DO 130 I=1,131
  3464. 130    LINE(I)=LINE(I+1)
  3465.     GOTO 6000
  3466. 100    CONTINUE
  3467.     IF(IMODE.EQ.0)GOTO 6000
  3468. C INPUT DIDN'T START WITH / SO TRY AND MAKE UP AN ENTER
  3469.     IF(LINE(2).EQ.'&')GOTO 6000
  3470. C 1& 2& ETC WORK STILL AS CURSOR CONTROLS
  3471.     C2='N'
  3472.     IF(LINE(1).EQ.'"')C2='"'
  3473. C    IF(LINE(1).GE.'0'.AND.LINE(1).LE.'9')C2='V'
  3474.     IF(LINE(1).LT.'0'.OR.LINE(1).GT.'9')GOTO 170
  3475. C INITIAL CHAR IS A DIGIT. IF 2ND CHAR IS ALSO A DIGIT OR
  3476. C SOMETHING REASONABLE THEN TREAT AS "EV" CMD. OTHERWISE
  3477. C JUST PASS AS A COMMAND SO CURSOR CTLS WORK STILL.
  3478.     IF(LINE(2).LE.' ')GOTO 6000
  3479. C ALLOW DIGIT FOLLOWED BY SPACE OR C.R. TO BE JUST CURSOR MOVE
  3480.     C2='V'
  3481. 170    CONTINUE
  3482. C MOVE DOWN PAST 'EV'
  3483.     II=3
  3484. C ALLOW US TO REMOVE INITIAL " IN E" CASE...
  3485.     IF(C2.EQ.'"')II=2
  3486.     DO 150 I=1,129
  3487.     M=133-I
  3488.     MM=M-II
  3489. 150    LINE(M)=LINE(MM)
  3490.     LINE(1)='E'
  3491.     LINE(2)=C2
  3492.     LINE(3)=' '
  3493.     GOTO 6000
  3494. 900    LINE(1)='*'
  3495. C MAKE COMMENT, THEN GO
  3496. 6000    CONTINUE
  3497. C MAINTAIN MODE FOR REST OF WORLD
  3498.     MODPUB=IMODE
  3499.     RETURN
  3500.     END
  3501. c -h- gtprd.for    Fri Aug 22 13:17:12 1986    
  3502.     SUBROUTINE GTPRD(IA1,IA2,IB1,IB2,IR1,IR2,N,M,L)
  3503.     REAL*8 A,B,R
  3504.       DIMENSION A(1),B(1),R(1)
  3505. C SPECIAL MATRIX MULTIPLY WITHIN SPREADSHEET MATRIX
  3506.     IAB=(IA2-1)*60+IA1-1
  3507.     IBB=(IB2-1)*60+IB1-1
  3508.     IRB=(IR2-1)*60+IR1-1
  3509.     DO 10 K=1,L
  3510.     DO 10 J=1,M
  3511.     NL=(J-1)*60+K
  3512.     R(1)=0.
  3513.     CALL XVBLST(NL+IRB,0,R)
  3514.     DO 10 I=1,N
  3515. C INVERT ROW/COLUMN USE FOR MATRIX A
  3516.     NM=(I-1)*60+J
  3517.     ML=(I-1)*60+K
  3518.     CALL XVBLGT(IAB+NM,0,A)
  3519.     CALL XVBLGT(IBB+ML,0,B)
  3520.     A(1)=A(1)*B(1)
  3521.     CALL XVBLGT(IRB+NL,0,R)
  3522.     R(1)=R(1)+A(1)
  3523.     CALL XVBLST(IRB+NL,0,R)
  3524. C    R(NL)=R(NL)+A(NM)*B(ML)
  3525. 10    CONTINUE
  3526.       RETURN
  3527.       END
  3528. c -h- index.fdd    Fri Aug 22 13:20:45 1986    
  3529.       INTEGER FUNCTION INDX ( STR, C )
  3530. C
  3531.     INTEGER*4 C
  3532.       CHARACTER * 1 STR ( 1 )
  3533. C
  3534. C LIMIT RANGE OF SEARCH TO 256 BYTES. THIS IS ARBITRARY BUT I DOUBT
  3535. C ANALYTICALC WILL EVER DEAL IN LONGER STRINGS THAN THIS AND
  3536. C SEARCHES ALL OVER THE CREATION ARE TO BE AVOIDED.
  3537.     I3B=0
  3538.       DO 20019  I = 1, 256
  3539.       IF (ICHAR(STR(I)).NE.0) GOTO 20021
  3540. C RETURN INDEX AS EITHER THE LOCATION OF THE CHARACTER OR 0
  3541.       INDX=0
  3542.       RETURN
  3543. 20021 CONTINUE
  3544.     IF(ICHAR(STR(I)).EQ.255)I3B=3
  3545.     IF(I3B.LE.0)GOTO 2000
  3546. C SKIP ENCODED VARIABLES
  3547.     I3B=I3B-1
  3548.     GOTO 20019
  3549. 2000    CONTINUE
  3550.       IF (.NOT.( STR ( I ) .EQ. CHAR(C) )) GOTO 20023
  3551.     ix=i
  3552.     if(i.gt.250)ix=0
  3553.       INDX = ( IX )
  3554.       RETURN
  3555. 20023 CONTINUE
  3556. 20022 CONTINUE
  3557. C
  3558. 20019 CONTINUE
  3559. 20020 CONTINUE
  3560.     INDX=255
  3561.     RETURN
  3562.       END
  3563. c -h- in2as.for    Fri Aug 22 13:21:02 1986    
  3564.     SUBROUTINE IN2AS(ROW,CHRS)
  3565.     InTeGer*4 ROW
  3566.     CHARACTER*1 CHRS(4)
  3567.     INTEGER*4 AC,AC1,AC2
  3568.     DO 1 N1=1,4
  3569. 1    CHRS(N1)=CHAR(32)
  3570. C CONVERT ROW TO LETTERS. ASSUMES COL=2 OR MORE. ROW 1=A-Z
  3571. C ROW 2=AA-AZ, THEN BA-BZ ETC.
  3572.     AC=ROW
  3573.     DO 2 N=1,4
  3574.     M=5-N
  3575. C CONVERT BACKWARDS INTO CHRS
  3576.     AC1=(AC/26)
  3577.     AC2=AC1*26
  3578.     IX=AC-AC2
  3579.     IF(.NOT.(IX.EQ.0.AND.AC1.GT.0))GOTO 772
  3580. C CORRECT SO WE GET Z, NOT A<NULL> FOR LABELS.
  3581.     IX=26
  3582.     AC1=AC1-1
  3583. 772    CONTINUE
  3584.     IF(IX.GT.0)CHRS(M)=CHAR(IX+64)
  3585. C CONVERT TO ASCII A-Z CHARACTER
  3586.     AC=AC1
  3587. 2    CONTINUE
  3588. C JUST IGNORE ANY OVERFLOW.
  3589.     RETURN
  3590.     END
  3591. c -h- indxq.for    Fri Aug 22 13:21:14 1986    
  3592.       INTEGER FUNCTION INDXQ ( STR, C )
  3593. C
  3594.     INTEGER*4 C
  3595.       CHARACTER * 1 STR ( 1 )
  3596. C
  3597. C LIMIT RANGE OF SEARCH TO 256 BYTES. THIS IS ARBITRARY BUT I DOUBT
  3598. C ANALYTICALC WILL EVER DEAL IN LONGER STRINGS THAN THIS AND
  3599. C SEARCHES ALL OVER THE CREATION ARE TO BE AVOIDED.
  3600.     I3B=0
  3601.       DO 20019  I = 1, 256
  3602.       IF (ICHAR(STR(I)).NE.0) GOTO 20021
  3603. C RETURN INDEX AS EITHER THE LOCATION OF THE CHARACTER OR OF THE
  3604. C END OF THE STRING FOR ANALYTICALC. NOTE THAT THIS DIFFERS
  3605. C FROM USUAL RATFOR VERSION.
  3606.       INDXQ=I
  3607.       RETURN
  3608. 20021 CONTINUE
  3609.     IF(ICHAR(STR(I)).EQ.255)I3B=3
  3610.     IF(I3B.LE.0)GOTO 2000
  3611. C SKIP ENCODED VARIABLES
  3612.     I3B=I3B-1
  3613.     GOTO 20019
  3614. 2000    CONTINUE
  3615.       IF (.NOT.( STR ( I ) .EQ. CHAR(C) )) GOTO 20023
  3616.       INDXQ = ( I )
  3617.       RETURN
  3618. 20023 CONTINUE
  3619. 20022 CONTINUE
  3620. C
  3621. 20019 CONTINUE
  3622. 20020 CONTINUE
  3623.     INDXQ=0
  3624.     RETURN
  3625.       END
  3626. c -h- inpost.for    Fri Aug 22 13:21:23 1986    
  3627.     SUBROUTINE INPOST (RETCD)
  3628. C COPYRIGHT (C) 1983 GLENN EVERHART
  3629. C ALL RIGHTS RESERVED
  3630. C 60=MAX REAL ROWS
  3631. C 301=MAX REAL COLS
  3632. C 60 MUST BE 1 LARGER TO HANDLE 1ST 27 VARIABLES IN AVBLS
  3633. C VBLS AND TYPE DIMENSIONED 60,301
  3634. C **************************************************
  3635. C *                                                *
  3636. C *            SUBROUTINE  INPOST                  *
  3637. C *                                                *
  3638. C **************************************************
  3639. C
  3640. C
  3641. C  CONVERTS THE INPUT STRING (INFIX NOTATION) TO POSTFIX
  3642. C  FOR LATER EVALUATION BY POSTVL
  3643. C
  3644. C
  3645. C
  3646. C  MODIFICATION CODES:  M3,M10
  3647. C
  3648. C
  3649. C MODIFIED 10-MAR-78 P.B. CHANGED STACK VALUE FOR FUNCTIONS FROM 15 TO 45
  3650. C   THIS CORRECTS IMPROPER EVALUATION OF SQRT(1.)-2.
  3651. C
  3652. C
  3653. C
  3654. C
  3655. C INPOST CALLS
  3656. C
  3657. C  ERRMSG   PRINTS ERROR MESSAGES
  3658. C  NEXTEL   GETS THE NEXT ELEMENT FROM LINE(80)
  3659. C
  3660. C
  3661. C
  3662. C INPOST IS CALLED BY CALC
  3663. C
  3664. C
  3665. C
  3666. C
  3667. C
  3668. C
  3669. C        THE VARIABLE AND FUNCTION CODES.
  3670. C TABLE ALSO GIVES COMPARE VALUES AND STACK VALUES OF
  3671. C FUNCTIONS THAT OCCUR WHEN EXPRESSIONS ARE EVALUATED.
  3672. C
  3673. C
  3674. C
  3675. C
  3676. C    STACK
  3677. C    ELEMENT                COMPARE    STACK
  3678. C    CODE    TYPE        BYTES    VALUE    VALUE
  3679. C
  3680. C    0    UNDEFINED    -    -    -
  3681. C    1    ASCII        1    -    -
  3682. C    2    DECIMAL        8    -    -
  3683. C    3    HEXADECIMAL    4    -    -
  3684. C    4    INTEGER        4    -    -
  3685. C    5    MULT.PREC.(10)    20    -    -
  3686. C    6    MULT.PREC.(8)    20    -    -
  3687. C    7    MULT.PREC.(16)    20    -    -
  3688. C    8    OCTAL        4    -
  3689. C    9    REAL        8    -    -
  3690. C    10-30    UNDEFINED    -    -    -
  3691. C
  3692. C    ----------FUNCTIONS------------
  3693. C
  3694. C    31    ABS (=DABS)    -    70    45
  3695. C    32    IABS        -    70    45
  3696. C    33    FLOAT        -    70    45
  3697. C    34    IFIX        -    70    45
  3698. C    35    AINT        -    70    45
  3699. C    36    INT (=IDINT)    -    70    45
  3700. C    37    EXP (=DEXP)    -    70    45
  3701. C    38    ALOG (=DLOG)    -    70    45
  3702. C    39    ALOG10(=DLOG10)    -    70    45
  3703. C    40    SQRT (=DSQRT)    -    70    45
  3704. C    41    SIN (=DSIN)    -    70    45
  3705. C    42    COS (=DCOS)    -    70    45
  3706. C    43    TANH (=DTANH)    -    70    45
  3707. C    44    ATAN (=DATAN)    -    70    45
  3708. C    45-47    ASIN,ACOS,TAN    -    70    45
  3709. C    45    RESERVED    -    -    -
  3710. C       48-100  RESERVED        -       -       -
  3711. C
  3712. C       110     (               -       70      15
  3713. C       111     UNARY -         -       50      49
  3714. C       112     **              -       40      39
  3715. C       113     *               -       30      31
  3716. C       114     /               -       30      31
  3717. C       115     +               -       20      21
  3718. C       116     -               -       20      21
  3719. C       117     )               -       10      -
  3720. C
  3721. C       200     =               -       10      10
  3722. C
  3723. C
  3724. C
  3725. C    VARIABLE      USE
  3726. C
  3727. C    I,K          HOLDS TEMPORARY InTeGer*4 VALUES.
  3728. C    LASTOP       HOLDS THE TYPE OF LAST ELEMENT OBTAINED
  3729. C                 ON LINE(80). SET AT 0 AT BEGINNING OF EXPRESSION.
  3730. C                 USED BY NEXTEL TO IDENTIFY UNARY OPERATORS.
  3731. C    NONBLK       POINTER IN LINE(80). NEXTEL STARTS SCAN AT NONBLK+1.
  3732. C    OPVAL(200,2)   HOLDS THE COMPARE AND STACK VALUE OF EACH OPERATOR.
  3733. C    PARVAL       HOLDS 110 WHICH IS THE CODE FOR '(' IN STACK 2.
  3734. C    RETCD        RETURN CODE. 1=O.K.  2=ERROR.
  3735. C    RETCD2       RETURN CODE FOR CALL TO NEXTEL.
  3736. C    RETTYP       HOLDS TYPE OF NEXT ELEMENT IN LINE, EITHER A FUNCTION
  3737. C                 CODE OR A DATA TYPE CODE.
  3738. C    RETVAL(100)  HOLDS VALUE OF NEXT ELEMENT IN LINE(80).
  3739. C    ST1LIM       HOLDS LIMIT OF STACK 1.
  3740. C    ST2LIM       HOLDS LIMIT OF STACK 2.
  3741. C    ST1PT        STACK 1 POINTER.
  3742. C    ST2PT        STACK 2 POINTER.
  3743. C    ST1TYP       TYPE OF EACH ELEMENT IN STACK 1
  3744. C    ST2TYP       TYPE OF EACH ELEMENT IN STACK 2
  3745. C    VLEN         HOLDS THE NUMBER OF BYTES USED BY EACH DATA TYPE.
  3746. C
  3747. C
  3748. C
  3749. C
  3750. C    SUBROUTINE INPOST (RETCD)
  3751. C
  3752. C
  3753. C
  3754.     InTeGer*4 LEVEL,NONBLK,LEND
  3755.     InTeGer*4 LASTOP
  3756.     InTeGer*4 VIEWSW,BASED
  3757.     InTeGer*4 OPVAL(200,2),PARVAL
  3758.     InTeGer*4 RETCD,RETCD2,RETTYP
  3759.     InTeGer*4 TYPE(1,1)
  3760.     InTeGer*4 ST1TYP(40),ST2TYP(40),ST1PT,ST2PT
  3761.     InTeGer*4 ST1LIM,ST2LIM
  3762.     InTeGer*4 VLEN(9)
  3763.     InTeGer*4 I,K
  3764. C
  3765.     CHARACTER*1 LINE(80)
  3766.     CHARACTER*1 AVBLS(20,27),RETVAL(20)
  3767.     CHARACTER*1 VBLS(8,1,1)
  3768.     CHARACTER*1 STACK1(8,40),STACK2(8,40)
  3769. C
  3770. C
  3771.     COMMON /STACK/STACK1,STACK2,ST1PT,ST2PT,ST1TYP,ST2TYP,
  3772.      1  ST1LIM,ST2LIM
  3773.     COMMON /V/TYPE,AVBLS,VBLS,VLEN
  3774.     InTeGer*4 DLFG
  3775. C    COMMON/DLFG/DLFG
  3776.     InTeGer*4 KDRW,KDCL
  3777. C    COMMON/DOT/KDRW,KDCL
  3778.     InTeGer*4 DTRENA
  3779. C    COMMON/DTRCMN/DTRENA
  3780.     REAL*8 EP,PV,FV
  3781.     DIMENSION EP(20)
  3782.     INTEGER*4 KIRR
  3783. C    COMMON/ERNPER/EP,PV,FV,KIRR
  3784. c    InTeGer*4 LASTOP
  3785. C    COMMON/ERROR/LASTOP
  3786.     CHARACTER*1 FMTDAT(9,76)
  3787. C    COMMON/FMTBFR/FMTDAT
  3788.     CHARACTER*1 EDNAM(16)
  3789. C    COMMON/EDNAM/EDNAM
  3790.     InTeGer*4 MFID(2),MFMOD(2)
  3791. C    COMMON/FRM/MFID,MFMOD
  3792.     InTeGer*4 JMVFG,JMVOLD
  3793. C    COMMON/FUBAR/JMVFG,JMVOLD
  3794.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  3795.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  3796. CCC    COMMON /ERROR/ LASTOP
  3797.     COMMON LEVEL,LINE,NONBLK,LEND,VIEWSW,BASED
  3798. C
  3799. C
  3800.     DATA OPVAL/30*-1,17*70,62*-1,70,50,40,30,30,20,20,10,82*-1,10,
  3801.      1             30*-1,17*45,62*-1,15,49,39,31,31,21,21,-1,82*-1,10/
  3802.     DATA PARVAL/110/
  3803. C
  3804. C
  3805. C
  3806. C
  3807. C
  3808. C  INITIALIZE STACKS, RETURN CODE DEFAULT, AND LASTOP
  3809.     RETCD=1
  3810.     ST1PT=1
  3811.     ST2PT=1
  3812.     LASTOP=0
  3813. C
  3814. C SET UP FOR NEXTEL CALL
  3815.     NONBLK=NONBLK-1
  3816. C
  3817. C
  3818. C
  3819. C
  3820. C **************************************************
  3821. C ***** GET NEXT ELEMENT OF EXPRESSION *************
  3822. C **************************************************
  3823. C
  3824. C
  3825. C
  3826. C  NEXTEL RETURNS
  3827. C    1    IF OPERAND
  3828. C    2    IF OPERATOR (VALUE IN RETTYP)
  3829. C    3    IF NO MORE ELEMENTS
  3830. C    4    IF ERROR
  3831. C
  3832. C
  3833. 50    CALL NEXTEL (RETVAL,RETTYP,RETCD2)
  3834.     GOTO (100,200,300,999),RETCD2
  3835.     STOP 50
  3836. C
  3837. C
  3838. C
  3839. C
  3840. C
  3841. C **************************************************
  3842. C ********  OPERAND FOUND, PUT ON STACK 1  *********
  3843. C **************************************************
  3844. C
  3845. C STACK 1 OVERFLOW CHECK
  3846. 100    IF (ST1PT.GT.ST1LIM) GOTO 990
  3847. C
  3848. C
  3849. C
  3850. C
  3851. C
  3852. 109    CONTINUE
  3853. C
  3854. C  SUBROUTINE ERRCX HAS ALREADY ASSURED THAT
  3855. C  IF AN OPERAND IS FOLLOWED BY AN = SIGN, THAT VARIABLE
  3856. C  IS NOT PART OF AN EXPRESSION.
  3857. C
  3858. C  VARIABLE INDEX IS TO BE PLACED IN STACK1 (1,ST1PT)
  3859. C  SO IF YOU WANTED TO SPEED THE OPERATION AT THE EXPENSE
  3860. C  OF SPACE, YOU WOULD ONLY COPY RETVAL(1) IF RETTYP < 0
  3861.     K=VLEN(IABS(RETTYP))
  3862.     DO 110 I=1,K
  3863. 110    STACK1(I,ST1PT)=RETVAL(I)
  3864.     ST1TYP(ST1PT)=RETTYP
  3865.     ST1PT=ST1PT+1
  3866.     GOTO 50
  3867. C
  3868. C
  3869. C
  3870. C
  3871. C
  3872. C
  3873. C
  3874. C
  3875. C **************************************************
  3876. C *****************  OPERATOR  *********************
  3877. C **************************************************
  3878. C
  3879. 200    CONTINUE
  3880. C
  3881. C IF NO OTHER OPERATOR ON STACK 2, PLACE ON STACK 2
  3882.     IF (ST2PT.EQ.1) GOTO 222
  3883. C
  3884. C
  3885. C COMPARE VALUE WITH OPERATOR IN STACK2, IF GREATER OR EQUAL THEN
  3886. C PLACE IN STACK 2 BECAUSE IT HAS HIGHER PRECEDENCE AND IS ASSOCIATED
  3887. C WITH PREVIOUSLY ENCOUNTERED OPERAND, IS A UNARY OPERATOR ASSOCIATED
  3888. C WITH THE FOLLOWING ELEMENT, OR IS A '(' WHICH IS SAVED UNTIL A ')'
  3889. C IS FOUND.
  3890. C
  3891.     K=ST2TYP(ST2PT-1)
  3892.     IF (OPVAL(RETTYP,1).GE.OPVAL(K,2)) GOTO 220
  3893. C
  3894. C
  3895. C IF POPPING OFF ELEMENTS FROM STACK2 BECAUSE ')' WAS FOUND THEN WHEN
  3896. C ')' IS FOUND WE GO TO 230 TO REMOVE THE OPERATOR '(' FROM STACK 2.
  3897. C
  3898.     IF (PARVAL.EQ.K) GOTO 230
  3899.     IF (ST1PT.GT.ST1LIM) GOTO 990
  3900. C
  3901. C
  3902. C
  3903. C OPERATOR ON STACK 2 GOES ONTO STACK 1.
  3904. C
  3905.     ST1TYP(ST1PT)=K
  3906.     ST1PT=ST1PT+1
  3907.     ST2PT=ST2PT-1
  3908.     GOTO 200
  3909. C
  3910. C
  3911. C  PUT OPERATOR ON STACK 2
  3912. 220    IF (ST2PT.GT.ST2LIM) GOTO 992
  3913. 222    ST2TYP(ST2PT)=RETTYP
  3914.     ST2PT=ST2PT+1
  3915.     GOTO 50
  3916. C
  3917. C
  3918. C REMOVE '(' FROM STACK 2
  3919. 230    ST2PT=ST2PT-1
  3920.     GOTO 50
  3921. C
  3922. C
  3923. C
  3924. C
  3925. C
  3926. C **************************************************
  3927. C ******* NO MORE ELEMENTS IN LINE *****************
  3928. C **************************************************
  3929. C
  3930. C CLEAN OFF STACK 2
  3931. 300    IF (ST2PT.EQ.1) GOTO 1000
  3932. C
  3933. C IF A '(' GO TO 350 TO THROW IT AWAY.
  3934.     IF (ST2TYP(ST2PT-1).EQ.PARVAL) GOTO 350
  3935.     IF (ST1PT.GT.ST1LIM) GOTO 990
  3936. C
  3937. C
  3938. C
  3939. C PLACE ELEMENT ON STACK 2 ONTO STACK 1.
  3940. C
  3941.     ST1TYP(ST1PT)=ST2TYP(ST2PT-1)
  3942.     ST1PT=ST1PT+1
  3943. C
  3944. C THROW AWAY '(' FROM STACK 2.
  3945. 350    ST2PT=ST2PT-1
  3946.     GOTO 300
  3947. C
  3948. C
  3949. C
  3950. C
  3951. C *** ERROR HANDLING ***
  3952. C
  3953. C STACK 1 OVERFLOW
  3954. 990    I=7
  3955.     GO TO 998
  3956. C
  3957. C STACK 2 OVERFLOW
  3958. 992    I=9
  3959. C
  3960. C
  3961. 998    CALL ERRMSG(I)
  3962. 999    RETCD=2
  3963. 1000    RETURN
  3964. C
  3965.     END
  3966. c -h- isgn.for    Fri Aug 22 13:21:52 1986    
  3967.       INTEGER FUNCTION ISGN(IARG)
  3968.       InTeGer*4 IARG
  3969.       IF(IARG.EQ.0)ISGN=0
  3970.       IF(IARG.GT.0)ISGN=1
  3971.       IF(IARG.LT.0)ISGN=-1
  3972.       RETURN
  3973.       END
  3974. c -h- jchar.for    Fri Aug 22 13:22:15 1986    
  3975.     INTEGER FUNCTION JCHAR(CHR)
  3976.     CHARACTER*1 CHR
  3977. c    INTEGER*1 ICH
  3978. C RETURN INTEGER VALUE OF CHARACTER AS IF IT WERE A SIGNED
  3979. C INTEGER BETWEEN -128 AND +127
  3980.     INTEGER*4 I
  3981. c    EQUIVALENCE(CHR,ICH)
  3982.     I=ICHAR(CHR)
  3983. c    I=ICH
  3984.     IF(I.GT.127)I=I-256
  3985.     JCHAR=I
  3986.     RETURN
  3987.     END
  3988. c -h- jmod.for    Fri Aug 22 13:22:15 1986    
  3989. C INTEGER*4 MODULO FUNCTION
  3990.     INTEGER*4 FUNCTION JMOD(I1,I2)
  3991.     INTEGER*4 I1,I2,I
  3992.     I=MOD(I1,I2)
  3993.     JMOD=I
  3994.     RETURN
  3995.     END
  3996. c -h- julasc.for    Fri Aug 22 13:22:15 1986    
  3997.     SUBROUTINE JULASC(N,DATST,IYR,IMO,IDA)
  3998. C CONVERT JULIAN DATE N INTO ASCII STRING STR
  3999.     INTEGER*4 DATST(2),DAT(2)
  4000.     CHARACTER*1 DATSTR(8)
  4001.     CHARACTER*2 YRST(1),MOST(1),DAST(1)
  4002.     EQUIVALENCE(YRST(1)(1:1),DATSTR(1)),
  4003.      1  (MOST(1)(1:1),DATSTR(4))
  4004.     EQUIVALENCE(DAT(1),DATSTR(1))
  4005.     EQUIVALENCE(DAST(1)(1:1),DATSTR(7))
  4006.     InTeGer*4 MLEN(12)
  4007.     DATA MLEN/31,28,31,30,31,30,31,31,30,31,30,31/
  4008.     DATSTR(3)='/'
  4009.     DATSTR(6)='/'
  4010. C FIRST SUBTRACT OFF WHOLE YEARS
  4011.     IYR=N/365
  4012.     N=N-(365*IYR)
  4013. C ADJUST FOR LEAP YRS SINCE 1981
  4014.     IAC=IYR/4
  4015.     N=N-IAC
  4016. C NOW SUBTRACT OFF MONTHS AS LONG AS POSSIBLE
  4017.     DO 1 NN=1,12
  4018.     IMO=NN
  4019.     IF(N.LE.MLEN(NN))GOTO 2
  4020.     N=N-MLEN(NN)
  4021. 1    CONTINUE
  4022. 2    CONTINUE
  4023.     IDA=N
  4024.     IYR=IYR+81
  4025.     WRITE(YRST(1)(1:2),3,ERR=5)IYR
  4026. C    ENCODE(2,3,YRST,ERR=5)IYR
  4027. 3    FORMAT(I2)
  4028.     WRITE(MOST(1)(1:2),3,ERR=5)IMO
  4029. C    ENCODE(2,3,MOST,ERR=5)IMO
  4030.     WRITE(DAST(1)(1:2),3,ERR=5)IDA
  4031. C    ENCODE(2,3,DAST,ERR=5)IDA
  4032. 5    CONTINUE
  4033.     IF(DATSTR(1).EQ.' ')DATSTR(1)='0'
  4034.     IF(DATSTR(4).EQ.' ')DATSTR(4)='0'
  4035.     IF(DATSTR(7).EQ.' ')DATSTR(7)='0'
  4036.     DATST(1)=DAT(1)
  4037.     DATST(2)=DAT(2)
  4038. C USE INTEGERS SINCE REAL*8 MIGHT OMIT FULL COPY IF
  4039. C EXPONENT BYTE IS 0, AND CHARS MAY CAUSE NORMALIZATION
  4040. C PROBLEMS SOMETIMES.
  4041.     RETURN
  4042.     END
  4043. c -h- julian.for    Fri Aug 22 13:22:15 1986    
  4044. C JULIAN DATE ROUTINES
  4045. C CALLS:
  4046. C    N=JULIAN(YY/MM/DD)
  4047. C    RETURNS JULIAN DATE BASED ON 1/1/80 FOR THAT DATE
  4048. C
  4049. C    CALL JULASC(N,STRADR)
  4050. C    TAKES JULIAN DATE AND DECODES TO ASCII YY/MM/DD
  4051. C
  4052. C    N=JULMDY(IYR,IMO,IDA)
  4053. C    RETURNS JULIAN DATE GIVEN SEPARATE Y,M,D
  4054. C
  4055.     FUNCTION JULIAN(DATST)
  4056.     INTEGER*4 DATST(2),DAT(2)
  4057.     CHARACTER*1 DATSTR(8)
  4058.  
  4059.     CHARACTER*1 YRST(2),MOST(2),DAST(2)
  4060.     CHARACTER*2 YRST2,MOST2,DAST2
  4061.     EQUIVALENCE(YRST2(1:1),YRST(1),DATSTR(1),DAT(1)),
  4062.      1  (MOST2(1:1),MOST(1),DATSTR(4)),
  4063.      2  (DAST2(1:1),DAST(1),DATSTR(7))
  4064. C    EQUIVALENCE(DATSTR(1),DAT(1))
  4065. C    EQUIVALENCE(YRST(1),DATSTR(1)),(MOST(1),DATSTR(4))
  4066. C    EQUIVALENCE(DAST(1),DATSTR(7))
  4067.     DAT(1)=DATST(1)
  4068.     DAT(2)=DATST(2)
  4069.     IJUL=1
  4070.     READ(YRST2(1:2),1,ERR=2)IYR
  4071. C    DECODE(2,1,YRST,ERR=2)IYR
  4072. 1    FORMAT(I2)
  4073.     READ(MOST2(1:2),1,ERR=2)IMO
  4074.     READ(DAST2(1:2),1,ERR=2)IDA
  4075. C    DECODE(2,1,MOST,ERR=2)IMO
  4076. C    DECODE(2,1,DAST,ERR=2)IDA
  4077.     IJUL=JULMDY(IYR,IMO,IDA)
  4078. 2    CONTINUE
  4079.     JULIAN=IJUL
  4080.     RETURN
  4081.     END
  4082. c -h- julmdy.for    Fri Aug 22 13:22:15 1986    
  4083.     FUNCTION JULMDY(IYR,IMO,IDA)
  4084.     InTeGer*4 MLEN(12)
  4085.     DATA MLEN/31,28,31,30,31,30,31,31,30,31,30,31/
  4086. C JULIAN DATE FROM Y,M,D
  4087. C BASE=1/1/81
  4088.     IJUL=1
  4089.     IF(IYR.LT.80)GOTO 999
  4090.     IYR=IYR-81
  4091.     IF(IMO.LE.0.OR.IMO.GT.12)GOTO 999
  4092.     IF(IDA.GT.31)GOTO 999
  4093. C JUST RETURN ILLEGAL ENTRIES AS 1/1/80
  4094.     AC=365.25*FLOAT(IYR)
  4095.     IAC=AC
  4096. C SLIGHTLY CRUDE BUT WORKABLE TREATMENT OF YEARS
  4097.     IJUL=IJUL+IAC
  4098. C NOW ADD IN MONTHS.
  4099.     IF(IMO.GT.2.AND.MOD(IYR+1,4).EQ.0)IJUL=IJUL+1
  4100. C ABOVE ACCOUNTS FOR LEAP YEARS
  4101.     III=IMO-1
  4102.     IF(III.LE.0)GOTO 22
  4103.     DO 2 N=1,III
  4104. 2    IJUL=IJUL+MLEN(N)
  4105. 22    CONTINUE
  4106. C NEXT DO DAYS
  4107.     IJUL=IJUL+IDA-1
  4108. C JUST ADD IN DAYS. SHOULD BE GOOD ENOUGH.
  4109. 999    CONTINUE
  4110.     JULMDY=IJUL
  4111.     RETURN
  4112.     END
  4113. c -h- jvblgt.for    Fri Aug 22 13:22:15 1986    
  4114.         SUBROUTINE JVBLGT(ID1,ID2,ID3,IVAL)
  4115. C
  4116. C JVBLGT - GET INTEGER*4 WORD OF 3 DIM VBLS ARRAY, ORIGINALLY
  4117. C  DIMENSIONED (2,60,301). HANDLE BY CALLING XVBLGT TO GET
  4118. C  CORRECT 8 BYTE VARIABLE, AND PULLING OUT CORRECT ONE
  4119.         InTeGer*4 ID1,ID2,ID3
  4120.         INTEGER*4 IVAL,LL(2)
  4121.         REAL*8 XX
  4122.         EQUIVALENCE(LL(1),XX)
  4123.         CALL XVBLGT(ID2,ID3,XX)
  4124.         IVAL=LL(ID1)
  4125.         RETURN
  4126.         END
  4127. c -h- jvblst.for    Fri Aug 22 13:22:15 1986    
  4128.         SUBROUTINE JVBLST(ID1,ID2,ID3,IVAL)
  4129. C JVBLST - SET I*4 WORD OF 3 DIM VBLS ARRAY, ORIGINALLY
  4130. C  DIMENSIONED (2,60,301). HANDLE BY CALLING XVBLST TO GET
  4131. C  CORRECT 8 BYTE VARIABLE, AND PUTTING IN CORRECT ONE
  4132.         InTeGer*4 ID1,ID2,ID3
  4133.         INTEGER*4 IVAL,LL(2)
  4134.         REAL*8 XX
  4135.         EQUIVALENCE(LL(1),XX)
  4136. C GET THE DESIRED 8 BYTES, THEN CHANGE THE ONES WE WANT. THEN...
  4137.         CALL XVBLGT(ID2,ID3,XX)
  4138.         LL(ID1)=IVAL
  4139. C PUT BACK THE 8 BYTES.
  4140.         CALL XVBLST(ID2,ID3,XX)
  4141.         RETURN
  4142.         END
  4143. c -h- mdet.for    Fri Aug 22 13:25:39 1986    
  4144.     SUBROUTINE MDET(XVBLS,I1,I2,J1,J2,DET)
  4145.     REAL*8 XVBLS(1),DET,SUMA,SUMB
  4146. C NOTE XVBLS IS 60 BY 301 MATRIX IN PORTACALC
  4147. C I1,I2 ARE TOP COL,ROW COORD; J1,J2 ARE BOTTOM
  4148. C STORAGE OF XVBLS IS (COL,ROW) SO LOCATIONS INSIDE
  4149. C IT ARE
  4150. C  ADDR=(ROW-1)*60+COL (60 IS # OF COLS)
  4151.     DET=0.
  4152.     N=J1-I1+1
  4153.     M=J2-I2+1
  4154.     IF(N.NE.M)RETURN
  4155.     IF(N.LE.1)RETURN
  4156. C ONLY SQUARE MATRICES MAY HAVE NONZERO DETERMINANTS
  4157. C ALSO, DIMENSION HAS TO BE > 1
  4158.     NN=N
  4159. C  FIXUP... (OK FOR N=2,3 ANYHOW)
  4160.     IF(N.EQ.2)NN=N-1
  4161. C  SUM OVER DIAGS...
  4162. C MULTIPLY DIAGONALS FROM TOP AND BOTTOM ROWS OF MATRIX AND GET
  4163. C DIFFERENCE EACH TIME FOR ACCURACY
  4164.     DO 1 N1=1,NN
  4165.     SUMA=1.
  4166.     SUMB=1.
  4167.     DO 2 N2=1,N
  4168.     NCL=N1+N2-1
  4169.     N2L=N+1-N2
  4170.     IF(NCL.GT.N)NCL=NCL-N
  4171. C NOW MULTIPLY SUMA (POSITIVE TERMS) BY X(NCL,N2) AND SUMB(NEG TERMS)
  4172. C BY X(NCL,N2L)
  4173.     LA=(N2-2+I2)*60+I1+NCL-1
  4174.     LB=(N2L-2+I2)*60+I1+NCL-1
  4175.     CALL XVBLGT(LA,0,XVBLS(1))
  4176.     SUMA=SUMA*XVBLS(1)
  4177.     CALL XVBLGT(LB,0,XVBLS(1))
  4178.     SUMB=SUMB*XVBLS(1)
  4179. 2    CONTINUE
  4180. C NOW ACCUMULATE TERMS IN DETERMINANT
  4181.     DET=DET+SUMA-SUMB
  4182. C DO IN THIS ORDER TO AVOID EXCESSIVE LOSS OF PRECISION DUE TO
  4183. C DIFFERENCES OF LARGE TERMS. THIS IS BAD ENOUGH AS IT IS...
  4184. 1    CONTINUE
  4185.     RETURN
  4186.     END
  4187. c -h- mthini.for    Fri Aug 22 13:25:45 1986    
  4188.     SUBROUTINE MTHINI(INDEXF,AC,SS,CTR,ACX)
  4189.     DIMENSION EP(20)
  4190.     InTeGer*4 DLFG
  4191. C    COMMON/DLFG/DLFG
  4192.     InTeGer*4 KDRW,KDCL
  4193. C    COMMON/DOT/KDRW,KDCL
  4194.     InTeGer*4 DTRENA
  4195. C    COMMON/DTRCMN/DTRENA
  4196.     REAL*8 EP,PV,FV
  4197.     DIMENSION EP(20)
  4198.     INTEGER*4 KIRR
  4199. C    COMMON/ERNPER/EP,PV,FV,KIRR
  4200.     InTeGer*4 LASTOP
  4201. C    COMMON/ERROR/LASTOP
  4202.     CHARACTER*1 FMTDAT(9,76)
  4203. C    COMMON/FMTBFR/FMTDAT
  4204.     CHARACTER*1 EDNAM(16)
  4205. C    COMMON/EDNAM/EDNAM
  4206.     InTeGer*4 MFID(2),MFMOD(2)
  4207. C    COMMON/FRM/MFID,MFMOD
  4208.     InTeGer*4 JMVFG,JMVOLD
  4209. C    COMMON/FUBAR/JMVFG,JMVOLD
  4210.     COMMON/KLSTO/DLFG,KDRW,KDCL,DTRENA,EP,PV,FV,KIRR,
  4211.      1  LASTOP,FMTDAT,EDNAM,MFID,MFMOD,JMVFG,JMVOLD
  4212. CCC    REAL*8 EP,PV,FV
  4213. CCC    COMMON/ERNPER/EP,PV,FV,KIRR
  4214.     REAL*8 AC,SS,CTR,ACX
  4215.     KIRR=0
  4216.     SS=0.
  4217.     CTR=0.
  4218.     ACX=0.
  4219.     DO 1 N=1,20
  4220. 1    EP(N)=0.
  4221.     AC=0.
  4222.     IF(INDEXF.EQ.1)AC=1.E20
  4223.     IF(INDEXF.EQ.2)AC=-1.E20
  4224.     RETURN
  4225.     END
  4226. c -h- mtxequ.for    Fri Aug 22 13:25:54 1986    
  4227.        SUBROUTINE MTXEQU(A1,A2,B1,B2,N,M,D)
  4228. C A1,A2 ARE DIMENSIONS OF A SUBMATRIX ORIGIN IN XVBLS
  4229. C B1,B2 ARE DIMS OF B SUBMATRIX
  4230. C
  4231. C NOTE THIS PROGRAM MUST BE MODIFIED TO WORK WITHIN THE SPREAD
  4232. C SHEET MATRIX RATHER THAN JUST ASSUMING THAT THE N DIMENSION
  4233. C AND M DIMENSION GIVE THE STORAGE ADDRESSES... ALTERNATIVELY,
  4234. C THE PROGRAM MUST OPERATE ONLY ON COPIED, DENSELY STORED
  4235. C MATRICES.
  4236. C
  4237. C
  4238. C   ORIGINAL PROGRAM TEXT FOLLOWS:
  4239. C       DIMENSION A(1),B(1)
  4240. CC ALTER DECLARATIONS FOR USE WITH SPREAD SHEET
  4241. C    REAL*8 A,B
  4242. C       KMAX=N-1
  4243. C       DO 90 K=1,KMAX
  4244. C       AMAX=0.
  4245. C       J2=K
  4246. C       DO 20 J1=K,N
  4247. C       IK=(J1-1)*N+K
  4248. C       IF(ABS(AMAX)-ABS(A(IK)))10,20,20
  4249. C10       AMAX=A(IK)
  4250. C       J2=J1
  4251. C20       CONTINUE
  4252. CC       EXCHANGE ROW K,J2 IF NECESSARY
  4253. C       IF(J2-K)30,60,30
  4254. C30       DO 40 J=K,N
  4255. C       J3=(K-1)*N+J
  4256. C       J4=(J2-1)*N+J
  4257. C       SAVE=A(J3)
  4258. C       A(J3)=A(J4)
  4259. C       A(J4)=SAVE
  4260. C40       CONTINUE
  4261. C       DO 50 J=1,M
  4262. C       J3=(K-1)*M+J
  4263. C       J4=(J2-1)*M+J
  4264. C       SAVE=B(J3)
  4265. C       B(J3)=B(J4)
  4266. C50       B(J4)=SAVE
  4267. CC       REDUCTION
  4268. C60       K1=K+1
  4269. C       KK=(K-1)*N+K
  4270. C       DO 80 I=K1,N
  4271. C       IK=(I-1)*N+K
  4272. C       DO 70 J=K1,N
  4273. C       IJ=(I-1)*M+J
  4274. C       KJ=(K-1)*M+J
  4275.  
  4276. C70       A(IJ)=A(IJ)-A(KJ)*A(IK)/A(KK)
  4277. C       DO 80 J=1,M
  4278. C       IJ=(I-1)*M+J
  4279. C       KJ=(K-1)*N+J
  4280. C80       B(IJ)=B(IJ)-B(KJ)*A(IK)/A(KK)
  4281. C90       CONTINUE
  4282. CC       SUBSTITUTE BACK
  4283. CC       NN=(N-1)*N+N
  4284. C       NN=N*N
  4285. C       DO 110 J=1,M
  4286. C       NJ=(N-1)*M+J
  4287. C       B(NJ)=B(NJ)/A(NN)
  4288. C       I1MAX=N-1
  4289. C       IF(I1MAX)110,110,95
  4290. C95       DO 111 I1=1,I1MAX
  4291. C       I=N-I1
  4292. C       IJ=(I-1)*M+J
  4293. C       II=(I-1)*N+I
  4294. C       I2=I+1
  4295. C       DO 100 L=I2,N
  4296. C       IL=(I-1)*N+L
  4297. C       LJ=(L-1)*M+J
  4298. C100       B(IJ)=B(IJ)-A(IL)*B(LJ)
  4299. C       B(IJ)=B(IJ)/A(II)
  4300. C111       CONTINUE
  4301. C110       CONTINUE
  4302. C       RETURN
  4303. C       END
  4304.     INTEGER A1,A2,B1,B2
  4305. C       DIMENSION A(1),B(1)
  4306. C ALTER DECLARATIONS FOR USE WITH SPREAD SHEET
  4307. C NOTE THAT OUR COLUMN DIMENSION IS 60, NOT N OR M HERE
  4308. C SUBSCRIPTS ARE (ROW-1)*COL-DIMENSION + COL
  4309. C  THEREFORE, CHANGE *N OR *M IN SUBSCRIPT COMPUTATIONS TO
  4310. C  *60
  4311.     REAL*8 A,B,AW1,AW2,BW1,BW2,AW3,AW4,AMAX
  4312.     INTEGER ABASE,BBASE
  4313.     ABASE=(A2-1)*60+A1-1
  4314.     BBASE=(B2-1)*60+B1-1
  4315.     D=1.
  4316.        KMAX=N-1
  4317.        DO 90 K=1,KMAX
  4318.        AMAX=0.
  4319.        J2=K
  4320.        DO 20 J1=K,N
  4321.        IK=(J1-1)*60+K
  4322.     CALL XVBLGT(IK+ABASE,0,A)
  4323.        IF(DABS(AMAX)-DABS(A))10,20,20
  4324. 10       AMAX=A
  4325.        J2=J1
  4326. 20       CONTINUE
  4327. C       EXCHANGE ROW K,J2 IF NECESSARY
  4328.        IF(J2-K)30,60,30
  4329. 30       DO 40 J=K,N
  4330.        J3=(K-1)*60+J
  4331.        J4=(J2-1)*60+J
  4332.     CALL XVBLGT(J3+ABASE,0,SAVE)
  4333. C       SAVE=A(J3)
  4334.     CALL XVBLGT(J4+ABASE,0,AW1)
  4335.     CALL XVBLST(J3+ABASE,0,AW1)
  4336.     CALL XVBLST(J4+ABASE,0,SAVE)
  4337. C       A(J3)=A(J4)
  4338. C       A(J4)=SAVE
  4339. 40       CONTINUE
  4340.        DO 50 J=1,M
  4341.        J3=(K-1)*60+J
  4342.        J4=(J2-1)*60+J
  4343. C       SAVE=B(J3)
  4344. C       B(J3)=B(J4)
  4345. C50       B(J4)=SAVE
  4346.     CALL XVBLGT(J3+BBASE,0,SAVE)
  4347.     CALL XVBLGT(J4+BBASE,0,BW1)
  4348.     CALL XVBLST(J3+BBASE,0,BW1)
  4349.     CALL XVBLST(J4+BBASE,0,SAVE)
  4350. 50    CONTINUE
  4351. C       REDUCTION
  4352. 60       K1=K+1
  4353.        KK=(K-1)*60+K
  4354.     CALL XVBLGT(KK+ABASE,0,A)
  4355.     IF(A.EQ.0)GOTO 999
  4356. C    IF(A(KK).EQ.0.)GOTO 999
  4357.        DO 80 I=K1,N
  4358.        IK=(I-1)*60+K
  4359.        DO 70 J=K1,N
  4360.        IJ=(I-1)*60+J
  4361.        KJ=(K-1)*60+J
  4362. C70       A(IJ)=A(IJ)-A(KJ)*A(IK)/A(KK)
  4363.     CALL XVBLGT(IJ+ABASE,0,AW1)
  4364.     CALL XVBLGT(KJ+ABASE,0,AW2)
  4365.     CALL XVBLGT(IK+ABASE,0,AW3)
  4366.     CALL XVBLGT(KK+ABASE,0,AW4)
  4367.     AW1=AW1-AW2*AW3/AW4
  4368.     CALL XVBLST(IJ+ABASE,0,AW1)
  4369. 70    CONTINUE
  4370.        DO 80 J=1,M
  4371.        IJ=(I-1)*60+J
  4372.        KJ=(K-1)*60+J
  4373. C80       B(IJ)=B(IJ)-B(KJ)*A(IK)/A(KK)
  4374.     CALL XVBLGT(IJ+BBASE,0,BW1)
  4375.     CALL XVBLGT(KJ+BBASE,0,BW2)
  4376.     BW1=BW1-BW2*AW3/AW4
  4377.     CALL XVBLST(IJ+BBASE,0,BW1)
  4378. 80    CONTINUE
  4379. 90       CONTINUE
  4380. C       SUBSTITUTE BACK
  4381.        NN=(N-1)*60+N
  4382. C       NN=N*N
  4383.     CALL XVBLGT(NN+ABASE,0,AW1)
  4384.     IF(AW1.EQ.0.)GOTO 999
  4385.        DO 110 J=1,M
  4386.        NJ=(N-1)*60+J
  4387. C       B(NJ)=B(NJ)/A(NN)
  4388.     CALL XVBLGT(NJ+BBASE,0,BW1)
  4389.     BW1=BW1/AW1
  4390.     CALL XVBLST(NJ+BBASE,0,BW1)
  4391.        I1MAX=N-1
  4392.        IF(I1MAX)110,110,95
  4393. 95       DO 111 I1=1,I1MAX
  4394.        I=N-I1
  4395.        IJ=(I-1)*60+J
  4396.        II=(I-1)*60+I
  4397.        I2=I+1
  4398.     CALL XVBLGT(II+ABASE,0,AW1)
  4399.        DO 100 L=I2,N
  4400.        IL=(I-1)*60+L
  4401.        LJ=(L-1)*60+J
  4402. C100       B(IJ)=B(IJ)-A(IL)*B(LJ)
  4403.     CALL XVBLGT(IJ+BBASE,0,BW1)
  4404.     CALL XVBLGT(IL+ABASE,0,AW2)
  4405.     CALL XVBLGT(LJ+BBASE,0,BW2)
  4406.     BW1=BW1-AW2*BW2
  4407.     CALL XVBLST(IJ+BBASE,0,BW1)
  4408. 100    CONTINUE
  4409. C       B(IJ)=B(IJ)/A(II)
  4410.     BW1=BW1/AW1
  4411.     CALL XVBLST(IJ+BBASE,0,BW1)
  4412. 111       CONTINUE
  4413. 110       CONTINUE
  4414.        RETURN
  4415. 999    CONTINUE
  4416.     D=0.
  4417.     RETURN
  4418.        END
  4419.